前缀、中缀、后缀表达式及中缀转后缀表达式

前缀表达式:

不含括号的算术表达式,而且是将运算符写在前面,操作数写在后面的表达式。

求法:

首先从右往左扫描表达式,从右边第一个字符判断,如果当前字符是数字,则一直到字符串的末尾再记录下来;如果是运算符,则将右边最近的两个数字串做相应的运算,以此作为一个新串并记录下来。一直扫描到最左端停止。

例子:(a + b)* (c + d) :  *+ab+cd。理解:根据优先级,把数字位置不同,有那两个可以做运算,将运算符写在对应的数字前面,做完数字之后还有的元素,放在最前面。

中缀表达式:

是一个通用的算术或逻辑公式表达方法,操作符是以中缀形式处于操作数中间,即我们常用的算术表达方式。

注意:中缀记法中括号是必须的。计算过程中用括号将相应的操作数和运算符括起来,用于指示运算的次序。

后缀表达式:

不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。

例子:(2 + 3)* 4 : 23+4*。理解:和前缀区别不大,是从左往右,保证数字字符的顺序位置不变即可。

分析过程:


参考代码:

#include<iostream>
#include<stack>
#include<string.h>
#include<ctype.h>//用于类型判断 
using namespace std;
stack<char> op; // 操作符栈 

char ans[1000];
int priority(char ch){
	switch(ch){
		case '(' : return -1;
		case '+':
	    case '-': return 1;
	    case '/':
	    case '*': return 2;
	}
}

bool isOperator(char ch){
	if(ch == '+' || ch == '-' || ch == '/' || ch == '*'){
		return true;
	}
	return false;
}

bool isCharacter(char ch){
	if(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z' 
	    || ch >= 'A' && ch <= 'Z'){
	    	return true;
		}
	    return false;
}

int main(){
	
	string str;
	while(cin >> str){
		int k = 0;
		int len = str.length();
		str[len] = '#';
		for(int i = 0; i <= len; i ++){// isdigit(str[i]) || isalpha(str[i])
			if(isCharacter(str[i])){
				ans[k ++] = str[i];
			}
			else if(isOperator(str[i])){
//				ans[k ++] = '#';
				if(op.empty()){
					op.push(str[i]);
				}
				else{
					while(!op.empty() && priority(op.top()) >= priority(str[i])){
						ans[k ++] = op.top();
						op.pop();
					}
					op.push(str[i]);
				}
			}
			else if(str[i] == '('){
				op.push(str[i]);
			}
			else if(str[i] == ')'){
				while(op.top() != '('){
					ans[k ++] = op.top();
					op.pop();
				}
				op.pop();
			}
			else if(str[i] == '#'){
				while(!op.empty()){
					ans[k ++] = op.top();
				    op.pop();
				}	
			}
		}
		cout << ans << endl;
	} 
	return 0;
} 
测试截图:



以上就是这篇的内容,欢迎指出错误和不足之处,谢谢!

为了回答你的问题,我将介绍前缀中缀后缀表达式,并展示如何在它们之间进行换。 1. 前缀表达式(也称为波兰式): 在前缀表达式中,运算符位于操作数之前。例如,表达式 "2 + 3" 的前缀形式为 "+ 2 3"。 2. 中缀表达式中缀表达式是我们通常使用的常规数学表达式形式。它使用括号和运算符的优先级来表示运算顺序。例如,表达式 "2 + 3" 就是一个中缀表达式。 3. 后缀表达式(也称为逆波兰式): 在后缀表达式中,运算符位于相应的操作数之后。例如,表达式 "2 + 3" 的后缀形式为 "2 3 +"。 现在,我将向你展示如何将中缀表达式换为前缀后缀表达式。 从中缀前缀换: 1. 反中缀表达式。 2. 将反中缀表达式换为后缀形式。 3. 反后缀表达式即可得到前缀表达式。 从中缀到后缀换: 1. 创建一个空栈和一个空输出列表。 2. 从左到右扫描中缀表达式的每个符号。 - 如果遇到操作数,将其添加到输出列表。 - 如果遇到运算符,将其压入栈中。 - 如果遇到左括号,将其压入栈中。 - 如果遇到右括号,则连续弹出栈顶元素并将其添加到输出列表,直到遇到左括号为止。注意:左括号不会被添加到输出列表中。 如果栈顶元素是左括号,则将其弹出栈。 - 如果遇到的运算符具有比栈顶运算符更高的优先级,将其压入栈中。 如果遇到的运算符具有与栈顶运算符相同的优先级,并且是左结合的运算符,则将栈顶运算符弹出并添加到输出列表中,然后将当前运算符压入栈中。 如果遇到的运算符具有与栈顶运算符相同的优先级,并且是右结合的运算符,则将当前运算符压入栈中。 - 重复步骤2直到扫描完整个中缀表达式。 3. 将栈中剩余的所有运算符弹出并添加到输出列表中。 4. 输出列表即为换后的后缀表达式。 希望这个解释对你有帮助!如果你有其他问题,可以继续问我。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值