#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool Priority(char fir,char sec)//比较两个运算符的优先级
{
if((fir=='+'||fir=='-')&&(sec=='*'||sec=='/'))
return true;
else
return false;
}
bool IsDigit(char data)//判断是否为数字
{
if(data>='0'&&data<='9')
return true;
else
return false;
}
bool IsSingn(char data)//判断是否为运算符
{
if(data=='+'||data=='-'||data=='*'||data=='/')
return true;
else
return false;
}
int Compute(int data1,char sign,int data2)//计算data1和data2的sign运算
{
if(sign=='+')
return data1+data2;
else if(sign=='-')
return data1-data2;
else if(sign=='*')
return data1*data2;
else if(sign=='/')
return data1/data2;
else
{
cout<<"you have an error sign!"<<endl;
return 0;
}
}
int Calculate(char source[],int n)//计算器主函数
{
int i,intData;
stack<int> digitStack;
stack<char> signStack;
for(i=0;i<n;i++)
{
if(IsDigit(source[i]))//数字直接放入数字栈
{
char str[5];
str[0]=source[i];
digitStack.push(atoi(str));
}
else if(IsSingn(source[i]))
{
if(signStack.empty())//符号栈空,也就是第一个运算符或者前边都计算完毕只剩最后一个运算符,直接入栈
signStack.push(source[i]);
else//和栈顶的符号比较,如果栈顶的符号优先级高,则用数字栈顶的两个数和符号栈顶的符号运算,
//并将这个个元素出栈,将结果入符号栈,i--,将当前符号和现在新的符号栈顶的符号比较优先级
{
char tmpSign=signStack.top();
if(Priority(tmpSign,source[i]))
{
signStack.push(source[i]);
}
else
{
int tmpDigit1=digitStack.top();
digitStack.pop();
int tmpDigit2=digitStack.top();
digitStack.pop();
int computeResult=Compute(tmpDigit2,tmpSign,tmpDigit1);
signStack.pop();
digitStack.push(computeResult);
i--;
}
}
}
else
{
cout<<"you have input an error string"<<endl;
return 0;
}
}
//最后符号栈剩余一个符号,数字栈只剩下两个数字,计算之
int tmpDigit1=digitStack.top();
digitStack.pop();
int tmpDigit2=digitStack.top();
digitStack.pop();
char tmpSign=signStack.top();
signStack.pop();
int computeResult=Compute(tmpDigit2,tmpSign,tmpDigit1);
return computeResult;
}
int main()
{
char str[20];
int i=0;
do
{
cin>>str[i];
i++;
}
while(str[i-1]!='@');//字符串以@结尾
cout<<Calculate(str,i-1)<<endl;
return 1;
}