题解 P1175 【表达式的转换】
这个程序绝对是我有史以来写过最长的程序。
没有之一
但肯定比楼下的短
总之分两段
a)中缀表达式转后缀表达式:五类
1.遇到操作数直接输出
2.遇到左括号,左括号入栈,栈内的优先级最低
3.遇到右括号,持续出栈操作,不停pop直至遇到左括号
4.如果是数字,不停地pop,直到遇到栈内优先级低于入栈符号的符号为止
5.扫完,将符号栈内所有剩余符号出栈输出
b)后缀表达式求值
1.每次只找到第一个运算符号,然后往前查到两个运算数
2.对两个运算数进行与运算符号相同的运算,将这一对运算数和它们的运算符去掉,把运算结果放回原处。
#include<bits/stdc++.h>
using namespace std;
int q[1000001],top;
int l,order[128];
char s[10000],a[10001];
void push(char x)
{
q[++top]=x;
}
char pop()
{
top--;
return q[top+1];
}
void push2(int x)
{
q[++top]=x;
}
int pop2()
{
top--;
return q[top+1];
}
int main ()
{
order['+']=order['-']=1;
order['*']=order['/']=2;
order['^']=3;
scanf("%s",s);
int n=strlen(s);
for(int i=0;i<n;i++){
if(s[i]<='9'&&s[i]>='0') a[++l]=s[i];
else {
if(s[i]=='(') push('(');
if(s[i]==')') {
while (q[top]!='(') a[++l]=pop();
pop();
}
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='^'){
while(order[s[i]]<=order[q[top]]) a[++l]=pop();
push(s[i]);
}
}
if(i==n-1) while(top!=0) a[++l]=pop();
}
for(int i=1; i<=l; i++){
printf("%c ",a[i]);
s[i-1]=a[i];
}
printf("\n");
for(int i=l;i<n;i++){
s[i]='\0';
}
top=-1;
int len=l;
for(int i=0;i<len;i++) {
if(s[i]>='0'&&s[i]<='9') {
push2(s[i]-'0');
continue;
}
int x=pop2();
int y=pop2();
if(s[i]=='+') push2(y+x);
if(s[i]=='-') push2(y-x);
if(s[i]=='*') push2(y*x);
if(s[i]=='/') push2(y/x);
if(s[i]=='^') {
int z=1;
for(int j=1;j<=x;j++)
z=z*y;
push2(z);
}
for(int j=0;j<=top;j++) printf("%d ",q[j]);
for(int j=i+2;j<=len;j++) printf("%c ",a[j]);
printf("\n");
}
// printf("%d",q[0]);
return 0;
}