【PTA】中缀表达式转换为后缀表达式并求值 (10 分)

在这里插入图片描述
输入样例:

6
2+4
3+2*7
2*(4+6)
(5/2+4)*5+2
(3+5)*(7-2)/4
5*(8-(3+2))

输出样例:

24+ 6
327*+ 17
246+* 20
52/4+5*2+ 32
35+72-*4/ 10
5832+-* 15

代码:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
	int n;
	cin>>n;
	getchar();
	while(n--)
	{
		string a;
		getline(cin,a);
		stack<char>op;
		stack<char>fina,fina2;
		for(int i=0;a[i];i++)
		{
			if(a[i]>='0'&&a[i]<='9') fina.push(a[i]);
			else if(a[i]!=')') 
			{
				if(op.size())
				{
					if(a[i]=='*'||a[i]=='/')
					{
						if(op.top()=='*'||op.top()=='/')
						{
							char ch=op.top();
							op.pop();						
							fina.push(ch);
							op.push(a[i]);
						}
						else op.push(a[i]);
					}
					
					else if(a[i]=='+'||a[i]=='-')
					{
						if(op.top()=='+'||op.top()=='-'||op.top()=='*'||op.top()=='/')
						{
							char ch=op.top();
							op.pop();						
							fina.push(ch);
							op.push(a[i]);
						}
						else op.push(a[i]);
					}
					else  op.push(a[i]);
				}
				else op.push(a[i]);
				
								
			}
			else
			{				
				while(op.top()!='(')
				{
					char ch=op.top();
					op.pop();
					fina.push(ch);
				}
				if(op.top()=='(') op.pop();
			}
		}
		
		while(op.size())
		{
			char ch=op.top();
			fina.push(ch);
			op.pop();
		}
		stack<char>f,temp;
		char ch;
		while(fina.size())
		{
			ch=fina.top();
			fina2.push(ch);
			f.push(ch);
			fina.pop();
		}
		while(fina2.size())
		{
			ch=fina2.top();
			cout<<ch;
			fina2.pop();
		}
		cout<<" ";
		
		int t1=0,t2=0;
		
		while(1)
		{
			ch=f.top();
			temp.push(ch);
			f.pop();
			
			if(temp.top()=='+'||temp.top()=='-'||temp.top()=='*'||temp.top()=='/')
			{
				char opp=temp.top();
				temp.pop();
				
				ch=temp.top();
				temp.pop();
				t1=ch-'0';
				
				ch=temp.top();
				temp.pop();
				t2=ch-'0';
				
				switch(opp)
				{
					case '+':
						temp.push((t2+t1)+'0');
						break;
					case '-':
						temp.push((t2-t1)+'0');
						break;
					case '*':
						temp.push((t2*t1)+'0');
						break;
					case '/':
						temp.push((t2/t1)+'0');
						break;
				}
			}
			
			if(f.empty())
			{
				cout<<temp.top()-'0'<<endl;
				break;
			}
		}
	}
	return 0;
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karshey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值