服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++利用栈实现中缀表达式转后缀表达式

C++利用栈实现中缀表达式转后缀表达式

2021-09-02 15:52Halosec_Wei C/C++

这篇文章主要为大家详细介绍了C++利用栈实现中缀表达式转后缀表达式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

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

延伸 · 阅读

精彩推荐
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30