当前位置:首页 > 通信资讯 > 正文

本文实例为大家分享了C++实现中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下

题目:现有中缀表达式如:1+(2-3)*4+10/5

请用栈的特性编写一个程序,使得程序输出后缀表达式

分析如下:

STEP1:

1+(2-3)*4+10/5

首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号“+”,入栈:

利用栈将中缀转换为后缀C语言(用栈实现中缀表达式到后缀表达式的转换)

STEP2:

1+(2-3)*4+10/5

第三个字符是“(”,依然是符号,入栈,接着是数字2,输出,然后是符号“-”,入栈:

利用栈将中缀转换为后缀C语言(用栈实现中缀表达式到后缀表达式的转换)

STEP3:

1+(2-3)*4+10/5

接下来是数字3,输出,紧跟着是“)”,此时,我们需要去匹配栈里的“(”,然后再匹配前将栈顶数据依次出栈(这就好比括号里优先执行的道理):

利用栈将中缀转换为后缀C语言(用栈实现中缀表达式到后缀表达式的转换)

STEP4:

1+(2-3)*4+10/5

紧接着是符号“*”,直接入栈

利用栈将中缀转换为后缀C语言(用栈实现中缀表达式到后缀表达式的转换)

STEP5:

1+(2-3)*4+10/5

遇到数字4,输出,之后是符号“+”,此时栈顶元素是符号“*”,按照先乘除后加减原理,此时栈顶的乘号优先级比即将入栈的加好要大,所以出栈。
栈中第二个元素是加号,按理来说大家平起平坐,但是按照先来后到的原则,栈里的加号呆得太久了,也要出栈透透气。(同理如果栈里还有其他操作符,也是出栈)

最后把刚刚的那个加号入栈,操作如下图:

利用栈将中缀转换为后缀C语言(用栈实现中缀表达式到后缀表达式的转换)

STEP6:

1+(2-3)*4+10/5

紧接着数字10,输出,最后是符号“/”,进栈:

利用栈将中缀转换为后缀C语言(用栈实现中缀表达式到后缀表达式的转换)

STEP7:

1+(2-3)*4+10/5

最后一个数字5,输出,所有的输入处理完毕,但是栈中仍然有数据,所以将栈中符号依次出栈。

总结规则:

从左到右遍历中缀表达式的每个数字和符号,若是数字则直接输出,若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级低于栈顶符号,则栈顶元素依次出栈并输出,直到遇到左括号或栈空才将低优先级的那个符号入栈

代码实现如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define STACK_INIT_SIZE 20
  4. #define STACKINCREMENT 10
  5. typedef char ElemType;
  6. typedef struct
  7. {
  8. ElemType *base;
  9. ElemType *top;
  10. int stackSize;
  11. }sqStack;
  12. InitStack(sqStack *s)
  13. {
  14. s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  15. if( !s->base )
  16. exit(0);
  17. s->top = s->base;
  18. s->stackSize = STACK_INIT_SIZE;
  19. }
  20. Push(sqStack *s, ElemType e)
  21. {
  22. // 栈满,追加空间,鱼油必须懂!
  23. if( s->top - s->base >= s->stackSize )
  24. {
  25. s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
  26. if( !s->base )
  27. exit(0);
  28. s->top = s->base + s->stackSize;
  29. s->stackSize = s->stackSize + STACKINCREMENT;
  30. }
  31. *(s->top) = e; // 存放数据
  32. s->top++;
  33. }
  34. Pop(sqStack *s, ElemType *e)
  35. {
  36. if( s->top == s->base )
  37. return;
  38. *e = *--(s->top); // 将栈顶元素弹出并修改栈顶指针
  39. }
  40. int StackLen(sqStack s)
  41. {
  42. return (s.top - s.base);
  43. }
  44. int main()
  45. {
  46. sqStack s;
  47. char c, e;
  48. InitStack( &s );
  49. printf("请输入中缀表达式,以#作为结束标志:");
  50. scanf("%c", &c);
  51. while( c != '#' )
  52. {
  53. while( c>='0' && c<='9' )
  54. {
  55. printf("%c", c);
  56. scanf("%c", &c);
  57. if( c<'0' || c>'9' )
  58. {
  59. printf(" ");
  60. }
  61. }
  62. if( ')' == c )
  63. {
  64. Pop(&s, &e);
  65. while( '(' != e )
  66. {
  67. printf("%c ", e);
  68. Pop(&s, &e);
  69. }
  70. }
  71. else if( '+'==c || '-'==c )
  72. {
  73. if( !StackLen(s) )
  74. {
  75. Push(&s, c);
  76. }
  77. else
  78. {
  79. do
  80. {
  81. Pop(&s, &e);
  82. if( '(' == e )
  83. {
  84. Push(&s, e);
  85. }
  86. else
  87. {
  88. printf("%c ", e);
  89. }
  90. }while( StackLen(s) && '('!=e );
  91. Push(&s, c);
  92. }
  93. }
  94. else if( '*'==c || '/'==c || '('==c )
  95. {
  96. Push(&s, c);
  97. }
  98. else if( '#'== c )
  99. {
  100. break;
  101. }
  102. else
  103. {
  104. printf("\n出错:输入格式错误!\n");
  105. return -1;
  106. }
  107. scanf("%c", &c);
  108. }
  109. while( StackLen(s) )
  110. {
  111. Pop(&s, &e);
  112. printf("%c ", e);
  113. }
  114. return 0;
  115. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

原文链接:https://blog.csdn.net/qq_41686130/article/details/82858997

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。