注意两点:
1、为了方便计算,我把输入的表达式最前面加左括号,最后面加右括号
2、次方运算设置为优先级最低。(因为这样做会让下一个运算符的优先级一定≥次方运算符)这样就能正确输出结果。
代码如下:
#include <iostream>
#include <stdlib.h>
#include <stack>
#include <map>
#include <math.h>
#define ll long long
using namespace std;
stack <ll> num;
stack <char> ch;
int yunsuan()
{
ll x2=num.top(); //注意x1与x2的顺序
num.pop();
ll x1=num.top();
num.pop();
char c=ch.top();
ch.pop();
switch(c)
{
case '+':
return x1+x2;
break;
case '-':
return x1-x2;
break;
case '*':
return x1*x2;
break;
case '/':
return x1/x2;
break;
case '^':
return x1 = pow(x1,x2);
break;
}
return 0;
}
bool cmp(char top,char a)
{
if((top=='('))
return false;
if(a=='^')
return false;
if((top=='+'||top=='-') && (a=='*'||a=='/'))
return false;
if((a=='+'||a=='-'))
return true;
return true;
}
int main()
{
string s;
cin>>s;
s = s+")";
ch.push('(');
int len = s.length();
for(int i=0; i<len; i++)
{
if(s[i]>='0' && s[i]<='9')
{
ll a=s[i]-'0';
for(i=i+1; i<len; i++){
if(s[i]>='0' && s[i]<='9')
{
a=a*10+(s[i]-'0');
}
else
{
i--;
break;
}
}
num.push(a);
}
else //是符号的时候
{
while(cmp(ch.top(),s[i]))
{
ll a = yunsuan();
num.push(a);
}
ch.push(s[i]);
}
}
cout<<num.top();
return 0;
}
如果有更好的解法或者想讨论的地方欢迎留言!