中缀表达式转前缀表达式

#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
	string mid;
	stack<char> stk;
	stack<char> cal;
	cin>>mid;
	int len=mid.length();
	for(int i=len-1;i>=0;i--)
	{
		char tmp;
		tmp=mid[i];
		if(tmp=='+')
	{
		if(!cal.empty())
		{
			if(cal.top()==')')
			{
				cal.push(tmp);
	                 }
			
			 else 
			{
				while((cal.top()=='*')||(cal.top()=='/'))
				{
					stk.push(cal.top());
					cal.pop();
					if(cal.empty())
					{
						break;
					}
				}
			}
		}

			cal.push(tmp);
         }


		else	if(tmp=='-')
	{
		if(!cal.empty())
		{
			if(cal.top()==')')
			{
				cal.push(tmp);
	                 }
			
			 else 
			{
				while((cal.top()=='*')||(cal.top()=='/'))
				{
					stk.push(cal.top());
					cal.pop();
					if(cal.empty())
					{
						break;
					}
				}
			}
		}
		
			cal.push(tmp);
         }

		else	if(tmp=='*')
		{
	
				cal.push(tmp);

		}


		else	if(tmp=='/')
		{
			
				cal.push(tmp);

		}


	else if(tmp=='(')
		{
              while(cal.top()!=')')
			  {
				  stk.push(cal.top());
				  cal.pop();
			  }
			  cal.pop();
		}
		else if(tmp==')')
			cal.push(tmp);
		else
			stk.push(tmp);
	}
	while(!cal.empty())
	{
		stk.push(cal.top());
		cal.pop();
	}
	while(!stk.empty())
	{
		cout<<stk.top();
		stk.pop();
	}
	return 0;
}

注意点:

1:,使用两个堆栈,cal堆栈用来保存运算符号,stk堆栈用来保存数字,或者称之为即将要输出的式子。

2,从,右往左阅读式子,因为我们知道,前缀表达式是数字在后,运算符号再前。

3,符号堆栈的特点,堆栈是LIFO,所以,我们知道,前缀表达式堆栈的顶端必然是符号优先级最低的。先不考虑括号,我们知道,(1)+,-,符号优先级比*,/符号要低,(2)靠右的,同等级的要比靠左的要低。而右边先读,所以第(2)点不需要考虑。

4,要满足优先级要求,当+,- 号遇到乘除时,必然要把乘除号推出栈顶。也就有了上面的while()循环。把高优先级的先输出咯,所以就先转移到stk堆栈,因为是按顺序输出的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值