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

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于PTA中缀表达式转换为后缀表达式并求值 (10 分)的主要内容,如果未能解决你的问题,请参考以下文章

中缀表达式转换成后缀表达式并求值

中缀表达式转换为后缀表达式

中缀表达式转换为后缀表达式

PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

中缀表达式求值