该算法涉及 + - * / ^ ( ) 及负数的中缀表达式求值,可作为模板
#include<iostream>
#include<stack>
#include<math.h>
#include<string>
using namespace std;
stack<int> num;
stack<char> ops;
string s;
void cal()
{
int a=num.top();
num.pop();
int b=num.top();
num.pop();
char c=ops.top();
ops.pop();//这一步别忘了!!
int d;
if(c=='+') d=a+b;
else if(c=='-') d=b-a;
else if(c=='*') d=b*a;
else if(c=='/') d=b/a;//除号是这个/
else d=pow(b,a);
num.push(d);
}
int main()
{
cin>>s;
s='('+s+')';//这一步别忘
for(int i=0; i<s.size(); i++)
{
if(s[i]>='0'&&s[i]<='9')
{
int t=0,j=i;
while(s[j]>='0'&&s[j]<='9')
{
t=t*10+s[j]-'0';
j++;
}
num.push(t);
i=j-1;
}
else if(s[i]=='(') ops.push(s[i]);
else if(s[i]=='+'||s[i]=='-')
{
if(s[i]=='-'&&i&&!(s[i-1]>='0'&&s[i-1]<='9')&&s[i-1]!=')') //注意判定条件的完整!!!
{
int t=0,j=i+1;
while(s[j]>='0'&&s[j]<='9')
{
t=t*10+s[j]-'0';
j++;
}
num.push(-t);
i=j-1;
}
else{
while(ops.top()!='(') cal();
ops.push(s[i]);//别忘了入栈
}
}
else if(s[i]=='*'||s[i]=='/'){
while(ops.top()=='*'||ops.top()=='/'||ops.top()=='^') cal();
ops.push(s[i]);
}
else if(s[i]=='^'){
while(ops.top()=='^') cal();
ops.push(s[i]);
}
else if(s[i]==')'){
while(ops.top()!='(') cal();
ops.pop();
}
}
cout<<num.top()<<endl;
return 0;
}