中缀表达式转后缀表达式或者前缀表达式

给出一串中缀表达式,1+((2+3)4)-5转成前缀- + 1 * + 2 3 4 5,或者转为后缀
123+4
5-+,其实转成前缀或者后缀思路是一样的,首先对字符串从左到右遍历设定优先级,±为1,*/为2,括号为0,以转化成前缀表达式为例,前缀的话对输入字符串要从右到左扫描,而后缀刚好相反,是从左到右扫描,遇到数字直接压入结果栈,遇到算符就和算符栈的栈顶元素进行优先级比较,如果算符栈顶的优先级高或者相等,就一直出栈,直到小于位置,再将当前字符压入算符栈顶。如果遇到的是右括号,就压栈,如果遇到左括号,就将算符弹出,直到遇到右括号位为止。字符串遍历完毕,就把算符栈里的所有符号全部弹出加入结果栈,最后对结果栈从后向前遍历输出即可。而前缀转成后缀的思路较为常规,这里就不详细写出。

中缀表达式转前缀表达式

#include<iostream>
#include<string>
using namespace std;
struct node{
	string x;
	int lev;
};//1+((2+3)*4)-5
node  quan[1005];
int setlevel(string s){
	int w1=0;

	for(int i=0;i<s.length();i++){
		if(s[i]=='('||s[i]==')'){
			quan[w1].x=s[i];
			quan[w1].lev=0;
		}
		else if(s[i]=='+'||s[i]=='-'){
			quan[w1].x=s[i];
			quan[w1].lev=1;
		}
		else if(s[i]=='*'||s[i]=='/'){
			quan[w1].x=s[i];
			quan[w1].lev=2;
		}
		else if(s[i]>='0'&&s[i]<='9'){
			int j=i;
			while(s[j]>='0'&&s[j]<='9'){
				j++;
			}
			quan[w1].x=s.substr(i,j-i);
			quan[w1].lev=100;
			i=j-1;//因为到最后i还要加一,所以这里的i是j-1 
		}
		w1++;


	}
	return w1;
}
void resolve(int w1){
	node res[100];
	node op[100];
	int w2=0,w3=0;
	op[w3].x="#";
	op[w3++].lev=-1;
	for(int i=w1-1;i>=0;i--){
		if(quan[i].lev==100){
			res[w2++]=quan[i];
		}
		else
		{
		 if(quan[i].x==")")op[w3++]=quan[i];
		else if(quan[i].x=="("){
			while(op[w3-1].x!=")"){
				res[w2++]=op[--w3];
			}
			w3--;
		}
		else {
			while(quan[i].lev<op[w3-1].lev)
			{
				res[w2++]=op[--w3];
				
			}
			op[w3++]=quan[i];
		}
		}
	
	}
	while(w3!=1){
		w3--;
		res[w2++]=op[w3];
	}
	for(int i=w2-1;i>=0;i--)
	cout<<res[i].x<<" ";
}
int main(){
	string s;
	getline(cin,s);
	int w1=setlevel(s);
	resolve(w1);
}

中缀表达式转后缀表达式

#include<iostream>
#include<string>
using namespace std;
struct node{
	string x;
	int level;
};//1+((2+3)*4)-5
node quan[1000];
int setquan(string s ){
	int w1;
	for(int i=0;i<s.length();i++){
		quan[w1].x=s[i];
		if(s[i]=='('||s[i]==')')
		{quan[w1].x=s[i];
		quan[w1].level=0;}
		else if(s[i]=='+'||s[i]=='-')
		{quan[w1].x=s[i];
		quan[w1].level=1;}
		else if(s[i]=='*'||s[i]=='/')
		{quan[w1].x=s[i];
		quan[w1].level=2;}
		else if(s[i]>='0'&&s[i]<='9'){
			int j=i;
			while(s[j]>='0'&&s[j]<='9'){
				j++;
			}
			quan[i].x=s.substr(i,j-i);
			quan[i].level=100;
			i=j-1;
		}
		w1++;
	}	
	return w1;
}
void solve(int w1){
	node op[1000];
	int opc=0;
	node res[1000];
	int resc=0;
	op[0].x='0';
	op[0].level=-1;
	opc++;
	for(int i=0;i<w1;i++){
		if(quan[i].level==100)
		res[resc++]=quan[i];
		else{
			if(quan[i].x=="(")op[opc++]=quan[i];
			else if(quan[i].x==")"){
				while(op[opc-1].x!="("){
					res[resc++]=op[--opc];
				}
				opc--;
			}
			else{
				while (quan[i].level<op[opc-1].level)
				res[resc++]=op[opc--];
				op[opc++]=quan[i];
			}
		}
	}
	while(opc!=1){
		res[resc++]=op[--opc];
	}
	for(int i=0;i<resc;i++)
	cout<<res[i].x;
}
int main(){
	int l;
	string s;
	getline(cin,s);
	l=setquan(s);
	solve(l);
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值