中缀表达式转换为后缀表达式(C)

    技术2022-05-11  66

    #include < stdio.h > #include < stdlib.h > #define  MAX 100 typedef  struct char  data[MAX];  int  top;}Stack1;typedef  struct char  data[MAX];  int  top;}Stack2; void  Init(Stack1  * stack1,Stack2  * stack2){ stack1 -> top = stack2 -> top =- 1 ;} int  check( char  ch,Stack1  * stack1,Stack2  * stack2){  int  i;  switch (ch) { case   ' + ' :   if (stack1 -> data[stack1 -> top] == ' - ' || stack1 -> data[stack1 -> top] == ' * ' || stack1 -> data[stack1 -> top] == ' / ' ){ stack2 -> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ]; stack1 -> data[ ++ stack1 -> top] = ch;} else  stack1 -> data[ ++ stack1 -> top] = ch; return   1 ; case   ' - ' : if (stack1 -> data[stack1 -> top] == ' + ' || stack1 -> data[stack1 -> top] == ' * ' || stack1 -> data[stack1 -> top] == ' / ' ){ stack2 -> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ]; stack1 -> data[ ++ stack1 -> top] = ch;} else  stack1 -> data[ ++ stack1 -> top] = ch; return   1 ; case   ' * ' : if (stack1 -> data[stack1 -> top] == ' / ' ){ stack2 -> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ]; stack1 -> data[ ++ stack1 -> top] = ch; } else  stack1 -> data[ ++ stack1 -> top] = ch;  return   1 ; case   ' / ' : if (stack1 -> data[stack1 -> top] == ' * ' ) { stack2 -> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ]; stack1 -> data[ ++ stack1 -> top] = ch; } else  stack1 -> data[ ++ stack1 -> top] = ch;  return   1 case   ' ) ' :i = stack1 -> top; while (stack1 -> data[i] != ' ( '   &&  i >= 0 )i -- if (i ==- 1 ) return   0 ; while (stack1 -> data[stack1 -> top] != ' ( ' ){ stack2 -> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ];}stack1 -> top -- ; return   1 ; }} void  main(){  int  i,flag,k = 0 ,sum1,sum2;  char  ch[MAX]; Stack1  * stack1 = (Stack1  * )malloc( sizeof (Stack1)); Stack2  * stack2 = (Stack2  * )malloc( sizeof (Stack2)); Init(stack1,stack2); printf( " 请输入中缀表达式: " ); gets(ch);  while (ch[k]) { if (ch[k] >= ' 0 ' && ch[k] <= ' 9 ' ) stack2 -> data[ ++ stack2 -> top] = ch[k]; else   if (ch[k] == ' ( ' ) stack1 -> data[ ++ stack1 -> top] = ch[k]; else   if (ch[k] == ' + '   || ch[k] == ' - ' || ch[k] == ' * '   ||  ch[k] == ' / ' || ch[k] == ' ) ' ) flag = check(ch[k],stack1,stack2);  if ( ! flag)  break ; k ++ ; }  if (flag) { for (i = 0 ;i <= stack1 -> top;i ++ ){  if (ch[i] == ' ( ' ) sum1 ++ if (ch[i] == ' ) ' ) sum2 ++ ;} if (sum1 != sum2){ printf( " 表达式错误. " );  return ;}printf( " 后缀表达式为: " ); for (i = 0 ;i <= stack2 -> top;i ++ ) printf( " %c " ,stack2 -> data[i]); for (i = stack1 -> top;i >= 0 ;i -- ) printf( " %c " ,stack1 -> data[i]);printf( " " );} else printf( " 表达式错误. " );getch(); } /* 编写一个程序,实现中缀表达式向后缀表达式的转换。要求:     键盘输入一个表达式,并以字符#表示结束;     输出为后缀表达式形式。 */  

    最新回复(0)