算法1
思路:中缀表达式,用栈
C++ 代码
#include<iostream>
#include<algorithm>
#include<unordered_map>//
#include<stack>
#include<cstring>
using namespace std;
stack<int> num;//存数字
stack<char> op;//存运算符号
void eval()
{
auto b=num.top();num.pop();//弹出倒数第二个数,
auto a=num.top();num.pop();//弹出倒数第一个数
auto c=op.top();op.pop();//
int x;
if(c=='+')x=a+b;
else if(c=='-')x=a-b;
else if(c=='*')x=a*b;
else x=a/b;
num.push(x);
}
int main()
{
unordered_map<char,int> pr{{'+',1},{'-',1},{'*',2},{'/',2}};//定义一下哈希表,存运算符的优先级
string str;
cin>>str;
for(int i=0;i<str.size();i++)//枚举一下每一个字符
{
char c=str[i];
if(isdigit(c))//如果是数字的话
{
int x=0,j=i;
while(j<str.size()&& isdigit(str[j]))
x=x*10+str[j++]-'0';
i=j-1;//这里是因为前面一步j++了
num.push(x);//将运算结果压栈
}
else if(c=='(')op.push(c);//遇见左括号,直接压栈
else if(c==')')//遇见右括号的情况
{
while(op.top()!='(')eval();//运算符号在遇到右括号之前,先将里面的值从右向左计算
op.pop();//最后弹出左括号
}
else//如果是一般运算符
{
while(op.size()&& pr[op.top()]>=pr[c])eval();//当栈顶元素的优先级大于当前元素的优先级,操作一下栈顶元素
op.push(c);//将当前元素压栈
}
}
while(op.size())eval();//最后,将所有没有处理完的运算符进行运算
cout<<num.top()<<endl;
return 0;
}