首页 > 代码库 > 中缀试转后缀试及前缀试并计算其结果
中缀试转后缀试及前缀试并计算其结果
1 /* 2 参考大神nb的代码,感觉思路不错!终于搞明白了!一开始不明白在计算表达式的时候,利用栈到底做了什么!现在感觉我们利用栈就是模拟我们书面上计算表达式, 3 将优先级高的运算先计算出来,然后放进栈中,等待下一次的计算 4 */ 5 #include<iostream> 6 #include<string> 7 #include<stack> 8 #include<cstdio> 9 using namespace std; 10 11 class node 12 { 13 public: 14 double ret; 15 string prefix, suffix;//前缀表达式和后缀表达式 16 node() 17 { 18 ret=0; 19 prefix=suffix=""; 20 } 21 }; 22 23 stack<node>optd;//操作数栈 24 stack<char>optr;//操作符栈 25 26 char formula[1000];//表达式以"=" 结束 27 28 int cmp(char ch)//定义符号的优先级 29 { 30 switch(ch) 31 { 32 case ‘#‘: return -2; 33 case ‘=‘: return -1; 34 case ‘+‘: 35 case ‘-‘: return 1; 36 case ‘*‘: 37 case ‘/‘: return 2; 38 case ‘(‘: return 3; 39 case ‘)‘: return 0; 40 } 41 return -2; 42 } 43 44 double deal(double x, char ch, double y) 45 { 46 switch(ch) 47 { 48 case ‘+‘: return x+y; 49 case ‘-‘: return x-y; 50 case ‘*‘: return x*y; 51 case ‘/‘: return x/y; 52 } 53 return 0.0; 54 } 55 56 void cal() 57 { 58 int i=0, n; 59 node num, aTmp, bTmp; 60 while(optr.top()!=‘=‘) 61 { 62 if(formula[i]>=‘0‘ && formula[i]<=‘9‘) 63 { 64 sscanf(formula+i, "%lf%n", &num.ret, &n); 65 num.prefix.assign(formula+i, n); 66 num.suffix.assign(formula+i, n); 67 i+=n; 68 optd.push(num); 69 } 70 else 71 { 72 if(optr.top()==‘(‘ && formula[i]==‘)‘)//消除一对括弧 73 { 74 optr.pop(); 75 ++i; 76 } 77 if(cmp(formula[i]) > cmp(optr.top()) || optr.top()==‘(‘)//当前运算符大于栈顶运算符直接进栈 78 { 79 optr.push(formula[i]); 80 ++i; 81 } 82 else 83 { 84 char ch=optr.top(), preTmp[]={ch, ‘ ‘, ‘\0‘}, sufTmp[]={‘ ‘, ch, ‘\0‘} ; 85 optr.pop();//弹出一个栈顶操作符 86 bTmp=optd.top(); optd.pop();//得到第二个操作数 87 aTmp=optd.top(); optd.pop();//得到第一个操作数 88 aTmp.ret=deal(aTmp.ret, ch, bTmp.ret); 89 90 aTmp.suffix+=" " + bTmp.suffix + sufTmp;//得到运算后的后缀式子 91 aTmp.prefix=preTmp + aTmp.prefix + " " + bTmp.prefix;//得到运算前的后缀式子 92 optd.push(aTmp);//不要忘记将计算的结果放入栈中 93 } 94 } 95 } 96 optr.pop();//别忘记弹出栈顶上的‘=‘ 97 } 98 99 int main()100 {101 optr.push(‘#‘);//初始化栈顶操作符是‘#’ 102 while(cin>>formula)103 {104 cal();105 node ans=optd.top(); optd.pop();106 cout<<"表达式结果:"<<ans.ret<<endl<<"前缀试:"<<ans.prefix+‘=‘<<endl<<"后缀试:"<<ans.suffix+‘=‘<<endl; 107 }108 return 0;109 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。