中缀转成逆波兰表达式再按栈的特性操作
如何转换?也是利用栈特性:
①数字放在数字的栈里面
②操作栈若为空 随便放
③(*/都是随便放的
④当遇见‘)’的时候,把操作栈逐个排出(每次排除拿数字栈的两个元素进行操作再塞回去结果),直到遇见‘(’,此时把‘(’弹出
⑤塞入+和-的时候,若前一个操作为‘*’或者‘/’,我们就弹出元素知道遇见左括号或者栈空
#include<iostream> #include<string.h> using namespace std; int cal(int a, int b, char c) { //cout << "a " << a <<" b " << b <<" c "<<c << endl; switch (c) { case '+': return a + b; break; case '-': return b - a; break; case '*': return a * b; break; case '/': return b / a; break; default: break; } } void print(int* a, int n) { for(int i = 0 ; i < n; i++) cout << a[i] << " "; cout << endl; cout << n << endl; } int main() { char ope[1000]; int num[1000]; char NUM[100]; int on,nn,NN; on = nn = NN = 0; string str; cin >> str; int l = str.length(); for(int i = 0; i < l ;i++) { if(str[i] == '+') { if(on == 0) ope[on++] = '+'; else if(ope[on - 1] == '*' || ope[i - 1] == '/') { while(on && ope[on - 1] != '(') { int a = num[--nn]; int b = num[--nn]; int c = cal(a,b,ope[--on]); num[nn++] = c; } ope[on++] = '+'; } else { ope[on++] = '+'; } } else if(str[i] == '-') { if(i == 0 || (str[i - 1] > '9' || str[i - 1] < '0')) { NUM[NN++] = '-'; } else if(on == 0) ope[on++] = '-'; else if(ope[on - 1] == '*' || ope[i - 1] == '/') { while(on && ope[on - 1] != '(') { int a = num[--nn]; int b = num[--nn]; int c = cal(a,b,ope[--on]); num[nn++] = c; } ope[on++] = '-'; } else ope[on++] = '-'; } else if(str[i] == '*') { ope[on++] = '*'; } else if(str[i] == '/') { ope[on++] = '/'; } else if(str[i] == '(') { ope[on++] = '('; } else if(str[i] == ')') { while(on && ope[on - 1] != '(') { int a = num[--nn]; int b = num[--nn]; int c = cal(a,b,ope[--on]); num[nn++] = c; } on--; } else if(str[i] == ' ') { continue; } else// { while((str[i] >= '0' && str[i] <= '9') && i < l) { NUM[NN++] = str[i++]; } NUM[NN] = 0; num[nn++] = atoi(NUM); NN = 0; i--;//别忘记减 } // cout << "i " << i << endl; // cout << " operat"<<endl; // for(int i = 0; i < on; i++) // { // cout << ope[i] << " "; // }cout << endl; // cout << " num"<<endl; // for(int i = 0; i < nn; i++) // { // cout << num[i] << " "; // }cout << endl<<endl; } //print(num,nn); while(on > 0) { int a = num[--nn]; int b = num[--nn]; int c = cal(a,b,ope[--on]); num[nn++] = c; //print(num,nn); //cout << " on " << on << " nn " << nn << endl; } cout << num[0] << endl; }