[SPOJ]算数表达式转换成逆波兰式

来源:互联网 发布:如何评价列宁 知乎 编辑:程序博客网 时间:2024/04/28 15:38

本人脑筋不太灵光,做些题目练练脑子吧。。。。T T

贴上找到的链接。感谢。

http://blog.csdn.net/sunmenggmail/article/details/7888723

核心思想:算数运算符栈中优先级越高的越在栈顶

#include <iostream>#include <string.h>#include <stack>using namespace std;stack<int> s1,s2;int compare(char c,char d){int result;switch(c){case '^':switch(d){case '+' : result = 1; break;case '-' : result = 1; break;case '*' : result = 1; break;case '/' : result = 1; break;case '^':  result = 0; break;}case '+':case '-':switch(d) {case '+' : result = 0; break;case '-' : result = 0; break;case '*' : result = -1; break;case '/' : result = -1; break;case '^':  result = -1; break;}break;case '*':case '/':switch (d){case '+' : result = 1; break;case '-' : result = 1; break;case '*' : result = 0; break;case '/' : result = 0; break;case '^':  result = -1; break;}break;}return result;}void pop_out(){char t;do {t = s1.top();s1.pop();if( t != '(' ) {s2.push(t);} else {break;}}while(true);}void calc(char op){do {if( s1.empty() ) break;char t_op = s1.top();if( op !='(' && t_op !='(' &&  compare(op,t_op)  < 0 ){s1.pop();s2.push(t_op);} else {break;}}while(true);}int main(){char expression[1024];int n;scanf("%d",&n);while(n--){scanf("%s",expression);int i = 0;int ex_len = strlen(expression);for(i=0;i<ex_len;i++) {if(expression[i] >='a' && expression[i] <= 'z') {s2.push(expression[i]);} else {switch (expression[i]){case '(':s1.push(expression[i]);break;case ')':pop_out();break;default:calc(expression[i]);s1.push(expression[i]);break;}}}while(!s1.empty()) {char t = s1.top();s1.pop();s2.push(t);}i = 0;while(!s2.empty()) {expression[i++] = s2.top();s2.pop();}expression[i] = 0;for(i=strlen(expression)-1;i>=0;i--){printf("%c",expression[i]);}printf("\n");}return 0;}




原创粉丝点击