输入一个字符串表达式,输出计算结果(队列、栈的应用)
来源:互联网 发布:佳明connect下载软件 编辑:程序博客网 时间:2024/05/16 05:43
#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");
}
- 输入一个字符串表达式,输出计算结果(队列、栈的应用)
- 输入一个字符串表达式,输出计算结果
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 栈的应用:通过用户输入后缀表达式,利用数据结构栈计算其结果值。
- 取得一个字符串表达式的计算结果(实现方法一)
- 取得一个字符串表达式的计算结果(实现方法二)
- 输入一个表达式,计算结果,charAt(0)输入一个字符
- 给定一个表示分数加减表达式的字符串,需要以字符串格式返回计算结果。结果表达式也是分数式
- 栈的应用--计算字符串表达式
- 栈的应用:计算字符串表达式
- 栈的应用:计算字符串表达式
- PHP 实现后缀表达式(接受四则运算字符串,输出计算结果,附代码)
- 输入一个字符串,将其各个字符对应的ASCII值加5后,输出结果。
- 字符串输入计算表达式
- js:制作一个简易的计数器:根据输入的两个整数和运算符,进行计算,然后输出计算结果
- 输入一个只包含个位数字的简单四则表达式字符串,计算该表达式的值
- 前端开发中的性能那点事(三)php的opcode缓存
- 制作rpm所依赖的spec文件详细说明
- C#中键值对应的操作类及方法
- VisifireChart 图表控件 Y轴 不显示数据
- Struts2的类型转换(1):基于ognl的类型转换
- 输入一个字符串表达式,输出计算结果(队列、栈的应用)
- 用户态到内核态切换之奥秘解析
- 详解C中的volatile关键字
- IOS设计模式学习(7)单例
- Windows Via C/C++:用户模式下的线程同步——原子操作:Interlocked函数族
- 0628学习笔记
- mongod最大连接数问题
- 进程切换之奥秘解析
- Java网络编程总结