【题意】输入一个只包含+ - * / 的非负整数计算表达式,计算该表达式的值
【思路】
1.设立两个堆栈,一个用来保存运算符,另一个用来保存数字
2.从左至右遍历字符串,若运算符栈栈顶运算符优先级小与该运算符或者此时运算符栈为空,则将该运算符压入堆栈
3.若运算符栈栈顶运算符优先级大于该运算符,则弹出该栈顶运算符,再从数字栈中依次弹出两个栈顶数字,进行计算,并把结果压入数字栈,重复比较此时栈顶运算符与当前遍历到的运算符的优先级,视情况重复步骤2或3
4.若遍历到数字,直接压入数字栈
5.若运算符栈还有运算符,则一直pop运算符以及两个数字符进行计算,直到没有任何运算符。
【样例输入输出】4+2*5-7/11 输出13.36
#include<iostream>
#include<stack>
#include<string.h>
#include<iomanip>
#include<map>
#include<algorithm>
using namespace std;
stack<char> opr;
stack<double> in;
std::map<char, int> m;
double compute(double a,double b,char c)
{
if(c=='+') return a+b;
else if(c=='-') return a-b;
else if(c=='*') return a*b;
else if(c=='/') return a/b;
}
int main(int argc, char const *argv[])
{
m['+']=1;
m['-']=1;
m['*']=2;
m['/']=2;
int i;
double a,b,temp;
char input[100];
while(cin>>input)
{
for(i=0;input[i]!=0;i++)
{
if((input[i]>='0')&&(input[i]<='9'))
{
temp=input[i]-'0';
while(input[i+1]>='0'&&input[i+1]<='9')//多位数字的情况
{
temp=temp*10+input[i+1]-'0';
i++;
}
in.push(temp);// 别忘了把字符的数字转成double数字
cout<<in.top()<<endl;
}
else
{
if(opr.empty()||m[opr.top()]<=m[input[i]])
opr.push(input[i]);
else
{
while(m[opr.top()]>m[input[i]])// 循环 当栈顶元素优先级大于该元素优先级时
{
b=in.top();
in.pop();
a=in.top();
in.pop();
in.push(compute(a,b,opr.top()));
opr.pop();
}
opr.push(input[i]);
}
}
}
while(!opr.empty())
{
b=in.top();
in.pop();
a=in.top();
in.pop();
in.push(compute(a,b,opr.top()));//wrong 谁在前谁在后
opr.pop();
}
cout<<fixed<<setprecision(2)<<in.top()<<endl;//保留两位小数
}
return 0;
}
1万+

被折叠的 条评论
为什么被折叠?



