#include <iostream>
#include<stack>
#include<deque>
#include<string>
using namespace std;
//C++混合四則運算
int pri(char c)//標識運算符優先級
{
switch(c)
{
case '+':
case '-':return 0;break;
case '*':
case '/':
case '%':return 1;break;
case '('://基本上用不到括號的優先級判斷
case ')':return -1;break;
}
}
bool ispunc(char c)//判斷是否為括號
{
if(c=='('||c==')') return true;
else return false;
}
void check(char c,stack<char>&obj2,deque<char>&obj3)//當obj1中出列的是運算符時,判斷優先級順序,將運算符入列obj3.
{
if(obj2.empty())
{
obj2.push(c);
return ;
}
if(ispunc(c))//如果是括號
{
if(c=='(') obj2.push(c);//如果是左括號直接壓棧
else{
while(obj2.top()!='(')//如果是右括號,則出棧obj2直到遇見左括號為止,匹配括號
{
obj3.push_back(obj2.top());
obj2.pop();
}
obj2.pop();//知道括號是不入隊列obj3的(也就是說括號不存在后序序列的)
}
}
else
{
if(pri(c)<=pri(obj2.top())) //如果不是括號,判斷它與棧頂運算符的優先級優先級高入棧,否
{ // 則出棧
obj3.push_back(obj2.top());
obj2.pop();
check(c,obj2,obj3);
}
else obj2.push(c);
}
}
void transf(deque<char>&obj1,stack<char>&obj2,deque<char>&obj3)
{
while(!obj1.empty()) //利用棧obj2來將中序序列轉換為后序序列obj3
{
char temp=obj1.front();
obj1.pop_front();
if(temp>='0'&&temp<='9')
{
obj3.push_back(temp);
}
else
check(temp,obj2,obj3);
}
while(!obj2.empty())
{
obj3.push_back(obj2.top());
obj2.pop();
}
}
void calcu(deque<char>&obj3)//利用逆波蘭表達式求值
{
stack<int>temp;
while(!obj3.empty())
{
char fc=obj3.front();
obj3.pop_front();
if(fc>='0'&&fc<='9') temp.push(fc-'0');//遇見數字入棧
else //遇見運算符,取出棧頂兩個元素(與運算符操作數匹配,如果帶有負號那么則取出一個)
{
int one=temp.top();
temp.pop();
int two=temp.top();
temp.pop();
switch(fc) //將運算后的結果壓入棧中
{
case '+':{temp.push(two+one);break;}//注意操作數two在前
case '-':{temp.push(two-one);break;}
case '*':{temp.push(two*one);break;}
case '/':{temp.push(two/one);break;}
case '%':{temp.push(two%one);break;}
}
}
}
cout<<"The result is:"<<temp.top()<<endl;//取最后棧中唯一元素作為運算結果
temp.pop();
}
int main()
{
stack<char>obj2;
deque<char>obj1,obj3;
string str;
cin>>str;
for(int i=0;i<str.size();++i)
obj1.push_back(str.at(i));
transf(obj1,obj2,obj3);
calcu(obj3);
return 0;
}