问题描述
输入一个只包含加减乘除和括号的合法表达式,求表达式的值,其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
代码如下: 表达式求值需将中缀表达式转换为后缀表达式
//遍历表达式,分别将操作数与操作符存储在s1,s2栈中,
//操作符进栈时需要判断优先级,若即将入栈的操作符 < 栈顶操作符的优先级,则取符(取后出栈)取数(取后出栈)进行运算,结果存入操作数栈。 否则,操作符入栈
//直到表达式遍历完毕并且运算符栈为空时,结束循环。输出操作数栈中的值(最终值)
#include <iostream>
#include <stack>
using namespace std;
string s; //输入表达式
stack<int>s1; //存储操作数
stack<char>s2; //存储操作符
//计算结果
int cal(int a,int b,char op){
switch(op){
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
}
}
//比较优先级
char cmp(char a,char b){
if(a=='#'){
return '<';
}
if(a=='+'||a=='-'){
if(b=='*'||b=='/'||b=='('){
return '<';
}else{
return '>';
}
}
if(a=='*'||a=='/'){
if(b=='('){
return '<';
}else{
return '>';
}
}
if(a=='('){
if(b==')'){
return '=';
}else{
return '<';
}
}
}
int main(){
s2.push('#');
cin>>s;
int i=0,num=0;
while(s2.top()!='#'||i<s.size()){
if(s[i]>='0'&&s[i]<='9'){ //操作数
num=0;
while(s[i]>='0'&&s[i]<='9'){
num*=10;
num+=s[i]-'0';
i++;
}
s1.push(num); //操作数入栈
}
else{
switch(cmp(s2.top(),s[i])){ //比较操作符优先级,
case '<':
s2.push(s[i]); //操作符优先级大于栈顶,直接入栈
i++;
break;
case '=':
s2.pop(); //左右括号相遇,左括号出栈
i++;
break;
case '>':
int a=s1.top(); // 操作符优先级小于栈顶,出栈计算
s1.pop();
int b=s1.top();
s1.pop();
s1.push(cal(b,a,s2.top())); //b op a
s2.pop(); //运算符出栈
break;
}
}
}
int res=s1.top(); //栈中存储的即为最后计算结果
s1.pop();
cout<<res<<endl;
return 0;
}
运行结果: