#include<iostream>
using namespace std;
#include<string>
#include<stack>
/*
作者 王加玉
2011/4/5
*/
/*
说明,计算1-10之内的四则运算;算法:输入一个四则运算,数字直接压入数字栈,压符号时,分三种情况进行压站:1符号栈为
空,直接压栈 2 压入的符号优先级不大于栈里面符号的优先级,弹符号栈,直到优先级大于栈顶符号优先级为止 3 当符号为')'时,
弹符号栈,直到找到'('为止; ,运算,每次从符号栈中弹出一个运算符时,同时从数字栈中弹出两个数字,把运算结果重新压入数字栈。
*/
/*
实现:只能实现0--9的带括号加减法运算
*/
// 注意 字符和整数的存储方式,'0'=48 .掌握好他们之间的转换方式
bool isDigit(char temp)
{
return temp>='0' && temp <='9';
}
int Level(char temp)
{
switch(temp)
{
case '+':return 1;break;
case '-':return 1;break;
case '*':return 2;break;
case '/':return 2;break;
default: return 3;
}
}
int main()
{
string inputStr;
cout<<"Please input a string:(end with '=')"<<endl;
cin>>inputStr;
// inputStr="5+4*(3+2)=";
stack<char> Operator;
stack<int> Operand;
int i=0;
char temp;
while((temp=inputStr[i])!='=')
{
if(!isDigit(temp))
{
if(Operator.empty()==true)
{
Operator.push(temp);
}
else
{
if(temp!=')')
{
while(Level(temp)<=Level(Operator.top()) && Operator.top()!='(')
{
char temp1=Operator.top();
int opan1=Operand.top();
Operand.pop();
int opan2=Operand.top();
Operator.pop();
Operand.pop();
switch(temp1)
{
case '+': opan1=(opan2)+opan1;break;
case '-': opan1=opan2-(opan1);break;
case '*': opan1=(opan2)*(opan1);break;
case '/': opan1=(opan2)/(opan1);break;
}
Operand.push(opan1);
}
Operator.push(temp);
}
else
{
while(Operator.top()!='(')
{
char temp1=Operator.top();
int opan1=Operand.top();
Operand.pop();
int opan2=Operand.top();
Operand.pop();
Operator.pop();
switch(temp1)
{
case '+': opan1=(opan2)+opan1;break;
case '-': opan1=opan2-(opan1);break;
case '*': opan1=(opan2)*(opan1);break;
case '/': opan1=(opan2)/(opan1);break;
}
Operand.push(opan1);
}
Operator.pop();
}
}
}
else
{
Operand.push(temp-'0');
}
i++;
}
while(!Operator.empty())
{
char temp1=Operator.top();
int opan1=Operand.top();
Operand.pop();
int opan2=Operand.top();
Operator.pop();
Operand.pop();
switch(temp1)
{
case '+': opan1=(opan2)+opan1;break;
case '-': opan1=opan2-(opan1);break;
case '*': opan1=(opan2)*(opan1);break;
case '/': opan1=(opan2)/(opan1);break;
}
Operand.push(opan1);
}
cout<<Operand.top()<<endl;
return 0;
}