前缀、中缀、后缀表达式转换C++

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

//优先级 
int you(char c){
	if(c=='+'||c=='-')
		return 0;
	else
		return 1;
}

//中缀转前缀,从后向前扫描,然后翻转 
void in2pre(char A[], char B[], int n){
	stack<char> sign;//符号栈 
	int j = 0;//B中元素个数 
	for(int i=n-1; i>=0; --i){
		//数字直接入栈 
		if(isdigit(A[i]))
			B[j++] = A[i];
		else if(A[i]==')')
			sign.push(A[i]);
		else if(A[i]=='('){
			while(sign.top()!=')'){
				B[j++] = sign.top();
				sign.pop();
			}
			sign.pop();//删掉右括号 
		}
		//符号比较优先级 
		else{
			if(sign.empty())
				sign.push(A[i]);
			else{
				//A[i]与栈顶元素比较优先级,直到遇到')'或者栈空 
				while(!sign.empty() && sign.top()!=')' && you(A[i])<you(sign.top())){
					B[j++] = sign.top();
					sign.pop();
				}
				sign.push(A[i]);
			}
		} 
	} 
	//栈中如果还有符号,直接添加到B中就ok 
	while(!sign.empty()){
		B[j++] = sign.top();
		sign.pop();
	}
	//翻转
	for(int i=0; i<j/2; ++i){
		int t = B[i];
		B[i] = B[j-i-1];
		B[j-i-1] = t;
	} 
} 

//中缀转后缀 
void in2post(char A[], char B[], int n){
	stack<char> sign;//符号栈 
	int j = 0;//B中元素个数 
	for(int i=0; i<n; ++i){
		//数字直接入栈 
		if(isdigit(A[i]))
			B[j++] = A[i];
		else if(A[i]=='(')
			sign.push(A[i]);
		else if(A[i]==')'){
			while(sign.top()!='('){
				B[j++] = sign.top();
				sign.pop();
			}
			sign.pop();//删掉左括号 
		}
		//符号比较优先级 
		else{
			if(sign.empty())
				sign.push(A[i]);
			else{
				//A[i]与栈顶元素比较优先级,直到遇到'('或者栈空 
				while(!sign.empty() && sign.top()!='(' && you(A[i])<you(sign.top())){
					B[j++] = sign.top();
					sign.pop();
				}
				sign.push(A[i]);
			}
		} 
	} 
	//栈中如果还有符号,直接添加到B中就ok 
	while(!sign.empty()){
		B[j++] = sign.top();
		sign.pop();
	}
} 

int main(){
	char A[16] = "1+2*3+(4*5+6)*7";
	char B[16] = {0};
	in2post(A, B, 15);
	for(int i=0; i<15; ++i){
		cout << B[i] << ' ';
	}
	return 0;
} 
中缀表达式是我们常见的数学表达式的一种写法,它是以操作符位于操作数的两侧的形式来表示计算顺序。而前缀表达式和后缀表达式中缀表达式的另外两种等价的写法。 将中缀表达式转换前缀表达式的方法如下: 1. 从右到左遍历中缀表达式的每个字符。 2. 如果字符是操作数,直接输出到前缀表达式。 3. 如果字符是操作符,有两种情况: - 如果操作符的优先级比栈顶操作符的优先级高,将操作符入栈。 - 如果操作符的优先级比栈顶操作符的优先级低或相等,弹出栈顶操作符,并将弹出的操作符和操作数组合为一个前缀表达式,再将该前缀表达式入栈。 4. 当遍历完中缀表达式后,将栈中的操作符依次弹出,并将每个弹出的操作符和操作数组合为一个前缀表达式,再将该前缀表达式入栈。 5. 最后得到的栈顶即为转换后的前缀表达式。 将中缀表达式转换后缀表达式的方法基本相同,只需将步骤3中操作符的优先级比较符号调整为"低或相等"即可。 转换中缀表达式后缀表达式的方法如下: 1. 从左到右遍历中缀表达式的每个字符。 2. 如果字符是操作数,直接输出到后缀表达式。 3. 如果字符是操作符,有两种情况: - 如果操作符的优先级比栈顶操作符的优先级高或栈为空,将操作符入栈。 - 如果操作符的优先级比栈顶操作符的优先级低或相等,弹出栈顶操作符,并将弹出的操作符和操作数组合为一个后缀表达式,再将该后缀表达式入栈。 4. 当遍历完中缀表达式后,将栈中的操作符依次弹出,并将每个弹出的操作符和操作数组合为一个后缀表达式,再将该后缀表达式入栈。 5. 最后得到的栈顶即为转换后的后缀表达式。 通过上述步骤,我们可以将中缀表达式转换前缀和后缀表达式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值