1. 程式人生 > >輸入一個字串表示式,輸出計算結果(佇列、棧的應用)

輸入一個字串表示式,輸出計算結果(佇列、棧的應用)

#include <iostream>
#include <queue>
#include <stack>
#include <string>
using namespace std;
string input;
queue<string> q;
stack<int> operand;
stack<string> symbol;
bool IsSymbol(string s)
{
if(s=="+"||s=="-"||s=="*"||s=="/"||s=="("||s==")")
return true;
else 
return false;
}
int utility(int a,int b,string t)
{
if(t=="+")
return a+b;
else if(t=="-")
return a-b;
else if(t=="*")
return a*b;
else if(t=="/")
return a/b;
}
bool IsMorePriority(string left,string right)
{
if(left=="(")
return false;
else if((right=="*"||right=="/")&&(left=="-"||left=="+"))
return false;
else 
return true;
}
void Split()
{
int s=input.size(),t=s;
do{
s=input.size();
for(int i=0;i!=input.size();++i)
{
if(input[i]==' ')
{
s=i;
while(i<input.size()&&input[i]==' ') i++;
t=i;
break;
}
}
if(s<input.size()&&t<input.size())
input=input.substr(0,s)+input.substr(t,input.size()-t);
else if(s<input.size())
{
input=input.substr(0,s);
}


}
while(s<input.size()&&t<input.size());
s=0;
while(s<input.size())
{
t=s;
while(s<input.size()&&!IsSymbol(string(1,input[s])))
s++;
if(s<input.size())
{
if(s!=t)
{
string temp=input.substr(t,s-t);
q.push(temp);
}
q.push(string(1,input[s]));
s++;
}
else
{
q.push(input.substr(t,s-t));
}
}
}
int calculate()
{
while(!q.empty())
{
string t=q.front();q.pop();
if(!IsSymbol(t))
{
operand.push(atoi(t.c_str()));
}
else
{
if(symbol.empty()||t=="(")
symbol.push(t);
else
{
if(t!=")")
{
while(!symbol.empty()&& IsMorePriority(symbol.top(),t))
{
int t1=operand.top();operand.pop();
int t2=operand.top();operand.pop();
string temp=symbol.top();symbol.pop();
t1=utility(t2,t1,temp);
operand.push(t1);
}
symbol.push(t);
}
else
{
while(symbol.top()!="(")
{
int t1=operand.top();operand.pop();
int t2=operand.top();operand.pop();
string temp=symbol.top();symbol.pop();
t1=utility(t2,t1,temp);
operand.push(t1);
}
symbol.pop();
}
}
}
}
while(!symbol.empty())
{
int t1=operand.top();operand.pop();
int t2=operand.top();operand.pop();
string temp=symbol.top();symbol.pop();
t1=utility(t2,t1,temp);
operand.push(t1);
}
return operand.top();
}
void main()
{
label:
cout<<"請輸入表示式:\n";
getline(cin,input);
Split();
cout<<calculate();
goto label;
::system("pause");


}