您的位置:首页 > 其它

输入一个字符串表达式,输出计算结果(队列、栈的应用)

2013-06-28 18:43 501 查看
#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");

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐