c++用栈计算逆波兰式

本文使用标准库

#include<iostream>
#include<stack>
using namespace std;

void Error(string c)
{
	cout << c << endl;
	exit(0);
}

int calculator(stack<double> OPND, char c)
{
	int a, b;	
	a = OPND.top(); 
	OPND.pop(); 
	b = OPND.top();
	OPND.pop();
	switch (c)
	{
	case '*':return b * c;
		break;
	case'/':
		if (b == 0)
		{
			Error("除法时分母不能为零");
		}
		return a / b;
		break;
	case '+':
		return a + b;
		break;
	case'-':
		return a - b;
		break;
	default:Error("运算错误");
	}

}

bool check(char a)
{
	if (a == '+' || a == '-' || a == '*' || a == '/')
	{
		return true;
	}
	else return false;
}


double calculate() {			// 从键盘输入逆波兰表达式,以‘ $ ’表示输入结束,本算法求逆波兰式表达式的值。
	stack<double> OPND;//数操作站
	double num = 0.0; 		// 数字初始化。
	char x[1000];
	double x1, x2;
	cin。get(x,1000);				//x 是字符型变量。cin.get()可以带空格的字符串输入,一般的如cin都会在空格处停止
	for (int i=0;x[i] != '$'&&i<1000;i++) 
	{
		char m = x[i];
		
		if (('0' <= x[i]&& x[i] <= '9') || x[i] == '.')
		{
			while ((x[i] >= '0' && x[i] <= '9') || x[i] == '.')
			{
				if (x[i] != '.') { num = num * 10 + (double(x[i]) - double('0')); i++; }		// 处理整数
				else 
				{
					double scale = 10.0;
					i++;									// 处理小数部分。
					while (x[i] >= '0' && x[i] <= '9')
					{
						num = num + (int(x[i]) - int('0')) / scale;
						scale = scale * 10;
						i++;
					}
				}
				
			}
			OPND.push(num); 
			num = 0.0;// 数压入栈,下个数初始化
		}
		if(x[i] ==',') continue; // 遇空格,继续读下一个字符。
		if (check(x[i]))
		{
			OPND.push(calculator(OPND, x[i]));
		}
	}
	cout << "后缀表达式的值为" << OPND.top();
	return OPND.top();
}
	
int main()
{
	calculate();
	
	system("pause");
	return 0;
}



利用,作为两个数字之间的分割号。怎么在输入中直接读取空格目前还没找到方法.
找到了:cin.get()可以带空格的字符串输入,一般的如cin都会在空格处停止读取字符,也就是只会读取空格前的字符;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

We Fab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值