c++逆波兰式(中缀表达式转化为后缀表达式)

前言:
一般算术表达(中缀表达),如#3*(4+2)/2-5#,#为表达式界定符,逆波兰
表达式(后缀表达式),如前述表达的后缀表达式为:3 4 2 + * 2 / 5 -。设中缀表达式的运算符有+、-、、/、#五种,运算符的优先级别从高到低为()、、/、+、-、#
注意:
有括号先算括号内,再算括号外的,多层括号由内向外进行

核心算法伪代码:
1.将两个栈初始化为#;
2.从左至右依次扫描表达式的每个字符,执行下述操作
2.1 若当前字符是运算对象,则输出该字符,处理下一个字符;
2.2 若当前字符是运算符且优先级别比栈 的栈顶运算符的优先级
高,则将该字符入栈 ,处理下一个字符;
2.3 若当前字符是运算符且优先级别比栈的栈顶运算符优先级别
低,则将栈的栈顶元素输出,当前字符入栈,处理下一个字符;
2.4 若当前字符是运算符且优先级别与栈的栈顶运算符的优先级相
等,则将栈的栈顶元素输出,当前字符入栈,处理下一个字符。

#include
#include//使用标准库的栈所需头文件 
using namespace std;
stack<char> s1;//运算符栈
stack<char> s2;//中间值栈
int youxianji(char x)//返回运算符号优先级 
{
	int y;
	switch(x){
		case '*':y=2;break;
		case '/':y=2;break;
		case '+':y=1;break;
		case '-':y=1;break;
		case '#':y=0;break;
	}
	return y;
}
void paixu(int i,char a[20])//处理符号算法 
{
	if(a[i]>='0'&&a[i]<='9')cout<<a[i];
	else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/') 
	{
		if(youxianji(a[i])>youxianji(s1.top()))s1.push(a[i]);//比栈顶优先级高则入栈
		else if(youxianji(a[i])<=youxianji(s1.top()))//低或相等出栈顶元素
		{
			cout<<s1.top();
			s1.pop();
			s1.push(a[i]);
		}
	}
}
int main()
{
	int i=-1;
	char a[20];
	s1.push('#');//初始化 
	s2.push('#');//初始化 
	cout<<"请输入表达式(长度小于10,输入#结束):"<<endl; 
	do{
		i++;
		scanf("%c",&a[i]);
	}while('#'!=a[i]);
	i=0;
	while('#'!=a[i])
	{
		if('('==a[i])//优先处理括号 
		{
			i++;//跳过括号不储存括号 
			while(')'!=a[i])//遇到右括号结束 
			{
				if(a[i]>='0'&&a[i]<='9')cout<<a[i];//遇到数字输出 
	            else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/') 
				{
		            if(youxianji(a[i])>youxianji(s2.top()))s2.push(a[i]); 
		            else if(youxianji(a[i])<=youxianji(s2.top()))
		            {
					    cout<<s2.top();
			            s2.pop();
			            s2.push(a[i]);
		            }
	            } 
				i++;     
			}
			while(s2.top()!='#')//输出括号中的符号 
			{
				cout<<s2.top();
				s2.pop();
			}
		}
		else paixu(i,a);
		i++;
	}
	for(i=0;i<s1.size();i++)//输出栈中所有符号 
	{
		cout<<s1.top();
		s1.pop();
	}
	return 0;
}

测试结果:
c++逆波兰式(中缀表达式转化为后缀表达式)_第1张图片

你可能感兴趣的:(c++逆波兰式(中缀表达式转化为后缀表达式))