输入一个字符串表达式,输出计算结果(队列、栈的应用)
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");
}
#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");
}
相关文章推荐
- 输入一个字符串表达式,输出计算结果
- 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
- 取得一个字符串表达式的计算结果(实现方法二)
- 给定一个表示分数加减表达式的字符串,需要以字符串格式返回计算结果。结果表达式也是分数式
- Java输入一个数字跟次数进行拼接方法(可计算结果),输出2+22+222+2222.........
- 第二周第三天([输入一个字符串,然后输出字符串的运算结果] [object][异常][IO流,读取D盘某个文件])
- 51.从键盘上输入任意两个数和一个运算符(+、-、*、/),根据输入的运算符对两个数计算,并输出结果
- 编写一函数,由实参数来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述的结果
- C#--第2周实验--任务三--编写一个控制台应用--输入x计算并输出分段函数F(x)的值
- 输入一个日期,判断这个日期在一年中是哪一天,是星期几,计算两个日期间的天数,使用字符串输出日期
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。 补充说明: 1、操作数为
- 在控制台上输入一个字符串,将其中夹杂的字母去除,只剩数字,然后对对这些数字进行全排列,输出全排列结果
- 编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息。
- 华为机试——通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 通过键盘输入100 以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- (华为机考题)通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。