标签:highlight 1.0 cst i++ 考研 cstring stack mes name
中缀式对于人来说很好计算,但对于计算机来说就很麻烦了。
统计计算机算,考研将中缀式转换为后缀式来计算。
比如中缀式:(1+2)*3-4
转换为后缀式:12+3*4-
后缀式的计算:从左到有遍历,遇见运算符式,将前面的两个值进行计算。
以(1+2)*3-4为例,它的后缀式是:12+3*4-
1、第一个运算符是- 前面的两个值分别是1和2,1+2=3,所以式子变成了33*4-
2、现在第一个运算符是*,3*3=9,变成了94-
3、现在第一个运算符是-,9-4=5,变成了5
所以最终的结果是5.
将中缀式转变成后缀式代码:
使用一个stack和一个vector。分下面几种情况,运算符优先级按 () < -+ < */
1、遇见 ( 时,直接将其压进栈里。
2、遇见 ) 时,将栈里的运算符依次弹出来,压进vector里,直到遇见 ( ,将 ( 弹出不压进vector里。
3、遇见数字时,直接将其压进vector
4、遇见 - 或 + 时,将栈里优先级大于等于 - + 的弹出压进vector里,然后将这个运算符压入栈里
5、遇见 * 或 / 时,将栈里优先级大于等于 * / 的弹出压进vector里,然后将这个运算符压入栈里。
6、最后将栈里的运算符依次弹出压进vector里。
void suffix() { for(int i = 0; str[i]; i ++) { if(str[i] == ‘(‘) { st1.push(‘(‘); }else if(str[i] == ‘)‘) { while(!st1.empty()&&st1.top()!=‘(‘) { vs.push_back(st1.top()); st1.pop(); } st1.pop(); }else if(str[i] == ‘+‘ || str[i] == ‘-‘) { while(!st1.empty()&&st1.top() != ‘(‘){ vs.push_back(st1.top()); st1.pop(); } st1.push(str[i]); }else if(str[i] == ‘*‘ || str[i] == ‘/‘) { while(!st1.empty()&&(st1.top()==‘/‘ || st1.top()==‘*‘)) { vs.push_back(st1.top()); st1.pop(); } st1.push(str[i]); }else if(str[i] != ‘ ‘){ while(str[i] >= ‘0‘ && str[i] <= ‘9‘) { vs.push_back(str[i]); i++; } i--; vs.push_back(‘#‘); } } while(!st1.empty()) { vs.push_back(st1.top()); st1.pop(); } }
中缀式转后缀式+计算:
#include <iostream> #include <vector> #include <stdio.h> #include <cstring> #include <stack> using namespace std; char str[310]; stack<char> st1; vector<char> vs; void suffix() { for(int i = 0; str[i]; i ++) { if(str[i] == ‘(‘) { st1.push(‘(‘); }else if(str[i] == ‘)‘) { while(!st1.empty()&&st1.top()!=‘(‘) { vs.push_back(st1.top()); st1.pop(); } st1.pop(); }else if(str[i] == ‘+‘ || str[i] == ‘-‘) { while(!st1.empty()&&st1.top() != ‘(‘){ vs.push_back(st1.top()); st1.pop(); } st1.push(str[i]); }else if(str[i] == ‘*‘ || str[i] == ‘/‘) { while(!st1.empty()&&(st1.top()==‘/‘ || st1.top()==‘*‘)) { vs.push_back(st1.top()); st1.pop(); } st1.push(str[i]); }else if(str[i] != ‘ ‘){ while(str[i] >= ‘0‘ && str[i] <= ‘9‘) { vs.push_back(str[i]); i++; } i--; vs.push_back(‘#‘); } } while(!st1.empty()) { vs.push_back(st1.top()); st1.pop(); } } double cal() { double tmp[110]; int top = -1; for(int i = 0; i < vs.size(); i ++) { if(vs[i] == ‘+‘) { tmp[top-1] += tmp[top]; top--; }else if(vs[i] == ‘-‘) { tmp[top-1] -= tmp[top]; top--; }else if(vs[i] == ‘*‘) { tmp[top-1] *= tmp[top]; top--; }else if(vs[i] == ‘/‘) { tmp[top-1] /= tmp[top]; top--; }else { int s = 0; while(vs[i] >= ‘0‘ && vs[i] <= ‘9‘) { s = s*10 + vs[i] - ‘0‘; i++; } tmp[++top] = 1.0*s; } } return tmp[0]; } int main() { gets(str); suffix(); for(int i = 0; i < vs.size(); i ++) { if(vs[i]!=‘#‘) cout << vs[i]; } cout << endl; double ans = cal(); printf("%.2lf\n",ans); return 0; }
标签:highlight 1.0 cst i++ 考研 cstring stack mes name
原文地址:https://www.cnblogs.com/xingkongyihao/p/8761310.html