5-20 表达式转换 (25分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号( ),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 using namespace std; 6 #define ERROR 0 7 #define OK 1 8 #define OVERFLOW -2 9 #define TRUE 1 10 #define FALSE 0 11 typedef struct Node *ptr; 12 typedef struct Node{ 13 int *base;//头指针 14 int *top;//尾指针 15 int stacksize;//最大容量 16 }Sqstack; 17 18 int InitStack(Sqstack &S) //此处是构造一个空栈 19 { 20 S.base = (int *)malloc(100 *sizeof(int)); 21 if (!S.base) exit(OVERFLOW); 22 S.top = S.base; 23 S.stacksize = 100; 24 return OK; 25 } 26 int Push(Sqstack &S,char e)//入栈操作 27 { 28 if(S.top-S.base>=S.stacksize) 29 { 30 S.base=(int *)realloc(S.base,(S.stacksize+10)*sizeof(int)); 31 if(!S.base) exit(OVERFLOW); 32 S.top=S.base+S.stacksize; 33 S.stacksize+=10; 34 } 35 *S.top++=e; 36 return OK; 37 } 38 char GetTop(Sqstack S,char &e)//返回头顶指针 39 { 40 if(S.top==S.base) 41 return ERROR; 42 else 43 return e=*(S.top-1); 44 } 45 46 char Pop(Sqstack &S,char &e) 47 { 48 if(S.top==S.base) 49 return ERROR; 50 else 51 return e=*--S.top; 52 } 53 54 int isoperator(char op) 55 { 56 switch(op) 57 { 58 case ‘+‘: 59 case ‘-‘: 60 case ‘*‘: 61 case ‘/‘: 62 return 1; 63 default: 64 return 0; 65 } 66 } 67 68 int Priority(char op) 69 { 70 switch(op) 71 { 72 case ‘#‘:return -2; 73 case ‘+‘: 74 case ‘-‘: 75 return 1; 76 case ‘*‘: 77 case ‘/‘: 78 return 2; 79 case ‘(‘: return -1; 80 case ‘)‘: return 2; 81 default: return -1; 82 } 83 } 84 85 void postfix(char mid[],char post[],int len)//将中缀表达式转为后缀表达式 86 { 87 int i,j=0; char e; 88 Sqstack abs; 89 InitStack(abs); 90 Push(abs,‘#‘); 91 for(i=0;i<len;i++) 92 { 93 if(mid[i]>=‘0‘&&mid[i]<=‘9‘) 94 { 95 post[j]=mid[i]; 96 j++; 97 } 98 else if(isoperator(mid[i]))//如果接受到的符号是加减乘除的话 99 { 100 while(Priority(mid[i])<=Priority(GetTop(abs,e))) 101 { 102 post[j]=Pop(abs,e); 103 j++; 104 } 105 while(Priority(mid[i])>Priority(GetTop(abs,e))) 106 Push(abs,mid[i]); 107 108 } 109 else if(mid[i]==‘(‘) 110 Push(abs,mid[i]); 111 else if(mid[i]==‘)‘) 112 { 113 while(GetTop(abs,e)!=‘(‘) 114 { 115 post[j]=Pop(abs,e); 116 j++; 117 } 118 Pop(abs,e); 119 } 120 } 121 while(GetTop(abs,e)!=‘#‘) 122 { 123 post[j]=Pop(abs,e); 124 j++; 125 } 126 } 127 int main() 128 { 129 char mid[21],post[21]; 130 int len; 131 scanf("%s",mid);//输入一个中缀表达式 132 len=(int)strlen(mid); 133 postfix(mid,post,len); 134 for(int i=0;i<len;i++) 135 { 136 cout<<post[i]; 137 } 138 cout<<endl; 139 return 0; 140 }
很惭愧,最后的结果没有通过所有的数据点,当然例子里面的数据是肯定没问题的,我不知道自己哪些情况没有考虑进去,如果你们发现了,欢迎在下面的评论区告诉我QAQ
时间: 2024-10-14 18:39:42