数据结构/PTA-表达式转换/数组
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
PTA最恶心题目之一,之前反复用栈做,只得了2分
栈的思路:
void Pass(char suffix[],char e) //将字符串复制到数组中 { } int Precede(char c,char ch) //判断栈顶运算符c和当前运算符ch的优先级,c>ch,返回1 { } void calculate(char suffix[],char e[]) //进行转换 { //suffix为前缀表达式,exp为输入表达式 STACK S; char ch; char *p; InitStack(S); //建立空栈; Push(S,'#'); //栈底以#为标识; p=e; ch=*p; while(StackEmpty(S)==1) { if(IN(ch)==1) //是数,放进数组里面 Pass(suffix,ch); else //不是数,进一步入栈 { char c; switch(ch) { case '(': Push(S,ch); break; case ')': Pop(S,c); while(c!='(') //取出两括号之间的所有符号翻入数组中 { Pass(suffix,c); Pop(S,c); } break; default : while((Gettop(S,c)==1)&&(Precede(c,ch)==1)) { Pass(suffix,c); Pop(S,c); } if(ch!='#') Push(S,ch); break; } } if(ch!='#') { p++; ch=*p; } }//while }
数组AC代码:
#include<bits/stdc++.h> using namespace std; int main() { char a[30],b[30]; //a是原式,b储存符号 int len; //字符串长度 scanf("%s",a); //输入 len=strlen(a); int j=0; int z=0,flag; //flag、w、z是判断符号 for(int i=0; i<len; i++) //开始符号处理 { flag=1; //flag=0:这次扫描的符号代表数的正负 //flag=1:这次扫描的符号代表数的加减乘除 //默认是1 if(a[i]<='9'&&a[i]>='0') { if(z==0||(a[i-1]>='0'&&a[i-1]<='9')||a[i-1]=='.') printf("%c",a[i]); else printf(" %c",a[i]); z++; } if(a[i]=='.') //①处理小数点 { printf("%c",a[i]); //连带着数字输出 } if(a[i]=='+'||a[i]=='-') //①处理加减号 { //+-是正负 if(i==0) //负数在开头 { if(a[i]=='-') printf("%c",a[i]);//复数,带着负号输出 flag=0; } else { if(a[i-1]=='-'||a[i-1]=='+'||a[i-1]=='*'||a[i-1]=='/'||a[i-1]=='(') { if(a[i]=='-') //负数在式中 { printf(" %c",a[i]); z=0; } flag=0; } } //+-是加减 if(flag==1) { if(j==0) { b[j]=a[i]; j++; } else if(b[j-1]=='+'||b[j-1]=='-'||b[j-1]=='(')//数的前面是一级符号 { b[j]=a[i]; j++; } else if(b[j-1]=='*'||b[j-1]=='/') //数的前面是二级符号 { while(j>0) //输出符号 { if(b[j-1]=='(') { break; } printf(" %c",b[j-1]); j--; } b[j]=a[i]; j++; } } }//if if(a[i]=='*'||a[i]=='/') //③处理乘除 { if(j==0) { b[j]=a[i]; j++; } else if(b[j-1]=='+'||b[j-1]=='-'||b[j-1]=='(') { b[j]=a[i]; j++; } } if(a[i]==')') //②处理括号 { while(j>0) { if(b[j-1]=='(') { j--; break; } printf(" %c",b[j-1]); j--; } } if(a[i]=='(') //②处理括号 { b[j]=a[i]; j++; } } while(j>0) //输出至末尾 { printf(" %c",b[j-1]); j--; } }