求助
查看原帖
求助
945017
0907_WDS_0731楼主2023/9/12 19:44

怎么判断^顺序,第二个样例顺序过不了,Subtask #1WA


/*
初始化两个栈:运算符栈s1和储存中间结果的栈s2;
从左至右扫描中缀表达式;
遇到操作数时,将其压s2;
遇到运算符时,比较其与s1栈顶运算符的优先级:
如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
否则,若优先级比栈顶运算符的高,也将运算符压入s1;
否则,将s1栈顶的运算符弹出并压入到s2中,再次转到①与s1中新的栈顶运算符相比较;
遇到括号时:
如果是左括号“(”,则直接压入s1;
如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃;
重复步骤⑵至⑸,直到表达式的最右边;
将s1中剩余的运算符依次弹出并压入s2;
依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式*/

#include<bits/stdc++.h>
using namespace std;

stack <char> s1,s2;
string s;
int n,num[500],sub,length;
int dight;
char oper[500],b[500];

int priority(char volume)
{
	if(volume=='+'||volume=='-')return 1;
	if(volume=='*'||volume=='/')return 2;
	if(volume=='^')return 3;
	return 0;
}

void output()
{
	for(int i=0;i<sub;i++)
	{
		if(oper[i]!=0)cout<<oper[i]<<" ";
		else cout<<num[i]<<" "; 
	 } 
	 cout<<endl;
}

void del(int cancel)
{
	for(int i=cancel;i<sub;i++)num[i-1]=num[i+1];
	for(int i=cancel;i<sub;i++)oper[i-1]=oper[i+1];
	sub-=2;
}
int main()
{
	cin>>s;
	length=s.size() ;
	for(int i=0;i<length;i++)
	{
		if(s[i]>='0'&&s[i]<='9')num[sub++]=s[i]-'0';
		else {
			if(s[i]==')')
			{
				while(s1.top()!='(')
				{
					oper[sub++]=s1.top();
					s1.pop();
				}
				s1.pop();
			}
			else {
				if(s1.empty())s1.push(s[i]);
				else{
					if(s[i]=='(')s1.push(s[i]);
					else{
						while(!s1.empty()&&priority(s1.top())>=priority(s[i]))
						{
							oper[sub++]=s1.top();
							s1.pop(); 
						}
						s1.push(s[i]); 
					}
					
				}
			}
		}
	}
	while(!s1.empty())
	{
		oper[sub++]=s1.top();
		s1.pop(); 
	}
	output();
	while(sub!=1)
	{
		dight++;
		if(oper[dight]==0)continue;
		else {
			int first=dight-1,second=dight-2;
			switch(oper[dight])
			{
				case '+': 
					num[second]+=num[first];
					del(dight);
					break;
				case '-':
					num[second]-=num[first];
					del(dight);
					break;
				case '*':
					num[second]*=num[first];
					del(dight);
					break;
				case '/':
					num[second]/=num[first];
					del(dight);
					break;
				case '^':
					num[second]=pow(num[second],num[first]);
					del(dight);
					break;
				default :
					break;
			}
			output();
			dight=0;
		}
	}
	return 0;
}
2023/9/12 19:44
加载中...