【王道】实现简单加减乘除计算器(C++)

【题意】输入一个只包含+ - * / 的非负整数计算表达式,计算该表达式的值

【思路】

1.设立两个堆栈,一个用来保存运算符,另一个用来保存数字

2.从左至右遍历字符串,若运算符栈栈顶运算符优先级小与该运算符或者此时运算符栈为空,则将该运算符压入堆栈

3.若运算符栈栈顶运算符优先级大于该运算符,则弹出该栈顶运算符,再从数字栈中依次弹出两个栈顶数字,进行计算,并把结果压入数字栈,重复比较此时栈顶运算符与当前遍历到的运算符的优先级,视情况重复步骤2或3

4.若遍历到数字,直接压入数字栈

5.若运算符栈还有运算符,则一直pop运算符以及两个数字符进行计算,直到没有任何运算符。

【样例输入输出】4+2*5-7/11   输出13.36

#include
#include
#include
#include
#include
#include
using namespace std;
stack opr;
stack in;
std::map 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<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<

 

你可能感兴趣的:(王道)