- 表达式求值
给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。
注意:

输入格式
共一行,为给定表达式。
输出格式
共一行,为表达式的结果。
数据范围
表达式的长度不超过 105。
输入样例:
(2+2)*(1+1)
输出样例:
8
思路:
“表达式求值问题:,两个要点:
①双栈,一个操作数栈,一个运算符栈
②运算符优先级,栈顶运算符和即将入栈的运算符的优先级比较:
如果栈顶的运算符优先级低,新运算符就直接入栈
如果栈顶的运算符优先级高,先出栈计算,新运算符再入栈
代码样例:
#include<bits/stdc++.h>
using namespace std;
stack<int> num;
stack<char> op;
//优先级表
unordered_map<char,int> h{{'+',1},{'-',1},{'*',2},{'/',2}};
void eval()//求值
{
int a=num.top();//第二个操作数
num.pop();
int b=num.top();//第一个操作数
num.pop();
char p=op.top();//运算符
op.pop();
int r=0;//结果
//计算结果
if(p=='+') r=a+b;
if(p=='-') r=b-a;
if(p=='*') r=b*a;
if(p=='/') r=b/a;
num.push(r);//结果入栈
}
int main()
{
string s;//读入表达式
cin>>s;
for(int i=0;i<s.size();i++)
{
if(isdigit(s[i]))//数字入栈
{
int x=0,j=i;//计算数字
while(j<s.size()&&isdigit(s[j]))
{
x=x*10+s[j]-'0';
j++;
}
num.push(x);//数字入栈
i=j-1;
}
//左括号无优先级,直接入栈
else if(s[i]=='(')//左括号入栈
{
op.push(s[i]);
}
//括号特殊,遇到左括号直接入栈,遇到右括号计算括号里面的
else if(s[i]==')')
{
while(op.top()!='(')//一直计算到左括号
eval();
op.pop();//左括号出栈
}
else
{
while(op.size()&&h[op.top()]>=h[s[i]])//待入栈运算符优先级低,则先计算
eval();
op.push(s[i]);//操作符入栈
}
}
while(op.size()) eval();//剩余的进行计算
cout<<num.top()<<endl;//输出结果
return 0;
}
博客围绕表达式求值问题展开,给定含 +,-,*,/ 运算符及括号的表达式,需计算最终值。介绍了输入输出格式、数据范围,重点阐述思路,采用双栈(操作数栈和运算符栈),依据运算符优先级处理,还给出代码样例。
223

被折叠的 条评论
为什么被折叠?



