怎么判断^顺序,第二个样例顺序过不了,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;
}