四则表达式运算(限制)

本文介绍了四则表达式的运算原理,特别是如何将表达式转化为后缀表达式。通过列举所有可能的情况,如处理括号、乘除和加减,详细阐述了转化过程。在进行后缀表达式计算时,需要注意字符到数值的转换细节。程序虽然在有限的测试数据下运行正确,但作者承认可能存在未发现的漏洞,并欢迎读者指出问题。
摘要由CSDN通过智能技术生成

四则表达式运算

原理介绍

	本文讲的四则运算表达式包括符号: + - * / ( ) ,即带括号的加减乘除运算。
同时能够巩固对栈的理解和运用。
	通常我们使用的表达式称为“中缀表达式”,特点是符号再运算数的“中间”;但是这样
的表达式让我们的计算机处理较为麻烦,波兰逻辑学家Jan Lukasiewicz就给出了另一种
表达式,称“后缀表达式”,也叫“逆波兰表达式”;
	譬如给出一个中缀表达式算式 : 9 * ( 3 - 1 )
	用逆波兰表达式即为 :931-*
		然后运算顺序是从第一个符号开始,将其前面两个数字运算
		931-* => 92*  => 18
		如此运算;
	这样的表达式算法无需括号,这也使得计算机深深的爱上了这样的表达式-逆波兰;
逆波兰表达式的算法就像栈的操作一样:
	1.遇到数字就入栈
	2.遇到运算符就将栈顶两数运算然后结果入栈
因此
	计算机对于后缀表达式能够更好的操作,如果是处理中缀表达式,大家可以自行简单
尝试一下,感受其中处理难度的差;

表达式转化

	问题来了,对于逆波兰表达式计算机可以很好的处理,但是需要得到一个逆波兰表达
式的方法才行呀。所以我们的难点还是在于:
	“如何将中缀表达式转化为后缀表达式?”【中缀==>后缀】
	要解决这个问题,我们必须首先规定下每个字符的【优先级】:
		右括号> 乘除 > 加减 >左括号
		) 大于 */ 大于 +- 大于 (
		
		大致的步骤如下:
			1.遇到数字输出
			2.遇到符号入栈(这里将入栈符号设为in,栈顶符号设为top)
				i).如果空栈,入栈
				ii).如果栈顶符号 优先级 不低于入栈符号
					从top开始弹栈,直至优先级低于入栈符号in结束,in入栈
				*注意:如果入栈符号in==右括号")",则遇到左括号"("停止弹栈;
				iii).如果栈顶符号 优先级 低于入栈符号
					top不弹栈,in入栈

code

//什么时候弹栈
void Determ(char in,string& ret,stack<char>& st) {
   		//栈顶符号 && 入栈符号
	//空栈
	if (st.empty()) {
   
		st.push(in);
		return;
	}
	//右括号时弹栈情况
	if (in == ')') {
   
		while (st.top() != '(') {
   		
			ret += st.top();
			st.pop();
		}
		if (!st.empty())	st.pop();	//由于是右括号就不入栈了
	}
	//
	else if (st.top() == '*' || st.top() == '/') {
   
		if (in == '*' || in == '/') {
   	//弹栈至top优先级小于in,即同级弹栈	入栈
			while (st.top() == '*' |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值