前缀、中缀、后缀表达式归纳

本文介绍如何使用栈来实现后缀表达式的求值,并提供了详细的C++代码示例。此外,还介绍了中缀表达式转换为后缀表达式的方法,包括具体的步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后缀表达式求值:

后缀表达式是无需进行处理可以直接被计算机处理的表达式,运算符通常位于操作数的后面,例如: 3 4 + 5 * 6 -   ,它是由中缀表达式(3 + 4) × 5 - 6转换过来的

后缀表达式进行求值时,设立一个栈s1,从左到右依次访问表达式中的元素,如果遇到数字直接压入栈中,如果遇到运算符就将栈中最上方的两个元素取出后进行相应的运算,将运算结果压入栈中。具体c++代码如下:

#include "stdafx.h"
#include <iostream>
#include <stack>
#include <string>

using namespace std;


/*后缀表达式*/
int main()
{
	string s;
	getline(cin,s);        //这里需要注意,因为输入的后缀表达式操作数与运算符之间有空格隔开,因此不能用cin或者scanf进行读入
	int len = s.size();     // cin或者scanf读入时,遇到空格就会判定为结束
	printf("%d\n",s.size());
	int a,b;
	stack<int> t;
	int i;
	for (i = 0;i < len;i++)
	{
		if (s[i] == '+' ||s[i] == '-' ||s[i] == '*' ||s[i] == '/' )
		{
			if (s[i] == '+')
			{
				a = t.top();
				t.pop();
				b = t.top();
				t.pop();
				a = a + b;
				t.push(a);
			}
			else if (s[i] == '-')
			{
				a = t.top();
				t.pop();
				b = t.top();
				t.pop();
				a = b - a;
				t.push(a);
			}
			else if (s[i] == '*')
			{
				a = t.top();
				t.pop();
				b = t.top();
				t.pop();
				a = a * b;
				t.push(a);
			}
			else if (s[i] == '/')
			{
				a = t.top();
				t.pop();
				b = t.top();
				t.pop();
				a = b / a;
				t.push(a);
			}
			i++;
		}
		else
		{
			int sum = 0;
			while (s[i] != ' ')//十位数以上
			{
				sum *= 10;
				sum += (s[i] - '0');//string s
				i++;
			}
			t.push(sum);
		}
	}
	printf("%d",t.top());
	getline(cin,s);  
}

  1.  

中缀表达式转换成后缀表达式


中缀表达式在求值时往往要先转换成相对应的后缀表达式,具体的做法是

1.设立两个栈t1,t2,分别用来存放运算符和操作数

2.从左至右扫描中缀表达式;

3.遇到操作数时,将其压入t2;
4.遇到运算符时,进行如下处理:
4-1.如果t1为空,或栈顶运算符为左括号“(”,或者该运算符为'(',则直接将此运算符入栈;
4-2.如果运算符为‘)’,那么依次将t1中的运算符弹出,压入t2,直到遇到一个‘(’,将它消除;

4-3.否则,将它与栈顶的运算符的优先级进行比较:

4-3-1.如果它的优先级大于栈顶运算符优先级,那么直接压入t1;

4-3-2.如果它的优先级小于栈顶运算符优先级,那么依次将t1中的运算符弹出,压入t2,直到遇见比它优先级小的,或者栈空,或者遇到‘(’,将它压入t1;

5.依次遍历完整个中缀表达式,栈t2中存放的就是所求的后缀表达式;


#include "stdafx.h"
#include <iostream>
#include <stack>
#include <string>

using namespace std;


/*前缀表达式*/
int main()
{
	string s;
	getline(cin,s);        //这里需要注意,因为输入的后缀表达式操作数与运算符之间有空格隔开,因此不能用cin或者scanf进行读入
	int len = s.size();     // cin或者scanf读入时,遇到空格就会判定为结束
	printf("%d\n",s.size());
	int a,b;
	stack<int> t;
	int i;
	for (i = 0;i < len;i++)
	{
		if (s[i] == '+' ||s[i] == '-' ||s[i] == '*' ||s[i] == '/' )
		{
			if (s[i] == '+')
			{
				a = t.top();
				t.pop();
				b = t.top();
				t.pop();
				a = a + b;
				t.push(a);
			}
			else if (s[i] == '-')
			{
				a = t.top();
				t.pop();
				b = t.top();
				t.pop();
				a = b - a;
				t.push(a);
			}
			else if (s[i] == '*')
			{
				a = t.top();
				t.pop();
				b = t.top();
				t.pop();
				a = a * b;
				t.push(a);
			}
			else if (s[i] == '/')
			{
				a = t.top();
				t.pop();
				b = t.top();
				t.pop();
				a = b / a;
				t.push(a);
			}
			i++;
		}
		else
		{
			int sum = 0;
			while (s[i] != ' ')//十位数以上
			{
				sum *= 10;
				sum += (s[i] - '0');//string s
				i++;
			}
			t.push(sum);
		}
	}
	printf("%d",t.top());
	getline(cin,s);  
}


前缀表达式求值:

前缀表达式求值和后缀表达式求值方法很相似,只不过前缀表达式求值是从右往左扫描表达式,遇到操作数则压入栈中,遇到运算符则弹出两个操作数计算结果后重新压入

中缀表达式转前缀表达式:

与中缀转后缀相似,只说明一下不同点:

1.中缀转前缀是从右到左扫描

2.在中缀转后缀中,如果运算符比栈顶运算符的优先级高,则压入栈中,否则要依次弹出运算符栈中的元素,直到栈顶元素优先级比它低;而在中缀转前缀时,这一规则改变为如 果运算符比栈顶运算符的优先级高或它们的优先级相等,则压入栈中。

### 前缀中缀后缀表达式的练习题 以下是针对前缀中缀后缀表达式的常见练习题目,涵盖了它们的转换与求值过程: #### 转换类题目 1. **将下列中缀表达式分别转换为前缀表达式和后缀表达式:** - \( A + B \times C \)[^1] - \( (A + B) \times (C - D) \)[^2] - \( A / B + C \times D \)[^3] 2. **已知后缀表达式,将其还原为中缀表达式并验证结果:** - 输入后缀表达式 `AB+C*`,写出对应的中缀表达式[^4]。 3. **给定前缀表达式,将其转换为中缀表达式:** - 输入前缀表达式 `+ * A B C`,写出对应的中缀表达式[^5]。 #### 求值类题目 1. **计算以下后缀表达式的值:** - 输入后缀表达式 `8 2 + 5 *`,计算其结果[^3]。 2. **计算以下前缀表达式的值:** - 输入前缀表达式 `- + 7 8 9`,计算其结果[^2]。 3. **输入一个复杂的中缀表达式,通过程序实现将其转换为后缀表达式后再求值:** - 中缀表达式:\( ((A + B) \times C) - (D / E) \)[^4]。 #### 应用类题目 1. **设计一个函数,能够接收任意形式的表达式(前缀中缀或后缀),并通过栈或其他数据结构完成求值。** 2. **编写一段代码,利用表达式树的方法将中缀表达式转换为后缀表达式,并给出具体步骤说明。** --- ```python # 示例代码:使用栈来计算后缀表达式的值 def evaluate_postfix(expression): stack = [] operators = set(['+', '-', '*', '/']) for char in expression.split(): if char not in operators: stack.append(int(char)) else: b = stack.pop() a = stack.pop() if char == '+': result = a + b elif char == '-': result = a - b elif char == '*': result = a * b elif char == '/': result = int(a / b) stack.append(result) return stack[-1] expression = "8 2 + 5 *" print(evaluate_postfix(expression)) # 输出应为 50 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值