50字范文,内容丰富有趣,生活中的好帮手!
50字范文 > C++中缀表达式求值(中缀表达式转后缀表达式)

C++中缀表达式求值(中缀表达式转后缀表达式)

时间:2023-12-25 16:01:58

相关推荐

C++中缀表达式求值(中缀表达式转后缀表达式)

problem

给你一个中缀表达式,就是平常的算术式,比如这样的1+4/2*3+4求计算结果

没有提交,我编几个样例把。

【输入样例】:

(((1)))(((1+1)))1+4/2*3+41+4/(2*3)+41+120/(20*3)+1

【输出样例】:

121154

【中缀表达式结果】

1.1.1.+1.4.2./3.*+4.+1.4.2.3.*/+4.+1.120.20.3.*/+1.+

solution

【中缀表达式转后缀:】

1)如果遇到操作数,我们就直接将其输出。2)如果遇到操作符(包括左括号),则我们将其放入到栈中。3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。ps)对于两位的数字,在转为中缀的时候记得加个点,方便求值

【后缀表达式求值:】

1)遇到数字时,将数字压入堆栈2)遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次栈顶元素 op 栈顶元素),并将结果入栈。

#include<bits/stdc++.h>using namespace std;int Youxianji(char op){if(op=='*'||op=='/')return 2;if(op=='+'||op=='-')return 1;if(op=='(')return 0;}void ToHouzhui(string str, string& ans){stack<char>stk;ans = "";int i =0;while(i<str.size()){if(str[i]>='0' && str[i]<='9'){//ans += str[i];int t = 0;while(str[i]>='0' && str[i]<='9'){t = t*10+str[i]-'0';i++;}ans += to_string(t)+".";}else{if(stk.empty()){stk.push(str[i]);}else if(str[i]=='('){stk.push(str[i]);}else if(str[i]==')'){while(stk.top()!='('){ans += stk.top();stk.pop();}stk.pop();}else{while(Youxianji(stk.top())>=Youxianji(str[i])){ans += stk.top();stk.pop();if(stk.empty())break;}stk.push(str[i]);}i++;}}while(stk.size()){ans += stk.top();stk.pop();}}int culate(string str){stack<int>stk;int ans = 0, i = 0;while(i < str.size()){if(str[i]>='0'&&str[i]<='9'){//stk.push(str[i]-'0');int t = 0;while(str[i]!='.'){t = t*10+str[i]-'0';i++;//cout<<t<<endl;}i++;//cout<<t<<endl;stk.push(t);}else{int a = stk.top(); stk.pop();int b = stk.top(); stk.pop();int tmp;if(str[i]=='+')tmp = b+a;if(str[i]=='-')tmp = b-a;if(str[i]=='*')tmp = b*a;if(str[i]=='/')tmp = b/a;stk.push(tmp);i++;}}return stk.top();}int main(){string s,t;while(cin>>s){ToHouzhui(s,t);//cout<<t<<endl;cout<<culate(t)<<endl;}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。