Conversion Algorithm

1、操作符栈压入"#";

2、依次读入表达式的每个单词;

3、如果是操作数则压入操作数栈;

4、如果是操作符,则将操作符栈顶元素与要读入的操作符进行优先级比较

(4.1)如果读入的是 ')',则将操作符栈中的元素压入操作数栈直至遇到 '(';

(4.2)如果读入的是 '(',压入操作符栈;

(4.3)如果栈顶元素优先级低,压入操作符栈;

(4.4)如果读入的元素不为'#',以及栈顶元素优先级高,则将栈顶元素压入操作数栈,将读入的元素压入操作符栈;

(4.5)如果操作符栈为空或操作符栈栈顶元素为 '(',压入操作符栈;

(4.6)其他,将操作符栈元素压出到操作数栈直至遇到'#';

5.将操作数栈元素逆序输出。

  1. //infix to postfix
  2. #include<iostream>
  3. #include<vector>
  4. using namespace std;
  5.  
  6. struct Node
  7. {
  8. char data;
  9. Node* next;
  10. };
  11.  
  12. class LinkStack
  13. {
  14. public:
  15. LinkStack()
  16. {
  17. top = new Node;
  18. top = NULL;
  19. }
  20. ~LinkStack()
  21. {
  22. delete top;
  23. }
  24. void push(char item);
  25. void pop();
  26. char front() const;
  27. void display()const;
  28. private:
  29. Node*top;
  30. };
  31.  
  32. void LinkStack::display()const
  33. {
  34. Node*p = top;
  35. vector<char>s = {};
  36. while (p != NULL)
  37. {
  38. s.push_back(p->data);
  39. p = p->next;
  40. }
  41. vector<char>s1 = {};
  42. vector<char>::size_type size = s.size();
  43. for (vector<char>::size_type i = 0; i < size; i++)
  44. s1.push_back(s[size - 1 - i]);
  45. for (auto i : s1)
  46. cout << i;
  47. cout << endl;
  48. }
  49.  
  50. void LinkStack::push(char item)
  51. {
  52. Node*p = new Node;
  53. p->data = item;
  54. p->next = top;
  55. top = p;
  56. }
  57.  
  58. void LinkStack::pop()
  59. {
  60. Node*p = top;
  61. top = top->next;
  62. delete p;
  63. }
  64.  
  65. char LinkStack::front()const
  66. {
  67. return top->data;
  68. }
  69.  
  70. bool isNum(char c)
  71. {
  72. return (c <= '9' && c >= '0');
  73. }
  74.  
  75. char Precede(char f, char c)
  76. {
  77. if (f == '+')
  78. {
  79. if (c == '*' || c == '/' || c == '(')return '<';
  80. else return '>';
  81. }
  82. else if (f == '-')
  83. {
  84. if (c == '*' || c == '/' || c == '(')return '<';
  85. else return '>';
  86. }
  87. else if (f == '*')
  88. {
  89. if (c == '(')return '<';
  90. else return'>';
  91. }
  92. else if (f == '/')
  93. {
  94. if (c == '(')return '<';
  95. else return'>';
  96. }
  97. else if (f == '(')
  98. {
  99. if (c == ')')return '=';
  100. else return '<';
  101. }
  102. else if (f == ')')return '>';
  103. else if (f == '#')
  104. {
  105. if (c == '#')return '=';
  106. else return '<';
  107. }
  108. }
  109.  
  110. void evaluate(LinkStack*SOPTR, LinkStack*SOPND)
  111. {
  112. SOPTR->push('#');
  113. char c;
  114. while (cin >> c)
  115. {
  116. if (isNum(c))
  117. {
  118. SOPND->push(c);
  119. }
  120. else
  121. {
  122. if (c == ')')
  123. {
  124. char c1 = SOPTR->front();
  125. while (c1 != '(')
  126. {
  127. SOPND->push(c1);
  128. SOPTR->pop();
  129. c1 = SOPTR->front();
  130. }
  131. SOPTR->pop();
  132. }
  133. else if (c == '(')
  134. SOPTR->push(c);
  135. else if (Precede(SOPTR->front(), c) == '<')
  136. {
  137. SOPTR->push(c);
  138. }
  139. else if (c!='#'&&Precede(SOPTR->front(), c) == '>')
  140. {
  141. char cha = SOPTR->front();
  142. SOPTR->pop();
  143. SOPTR->push(c);
  144. SOPND->push(cha);
  145. }
  146. else if (SOPTR->front() == '#' || SOPTR->front() == '(')
  147. {
  148. SOPTR->push(c);
  149. }
  150. else
  151. {
  152. char ch = SOPTR->front();
  153. while (ch != '#')
  154. {
  155. SOPND->push(ch);
  156. SOPTR->pop();
  157. ch = SOPTR->front();
  158. }
  159. }
  160. }
  161. }
  162. SOPND->display();
  163. delete SOPND, SOPTR;
  164. }
  165.  
  166. int main()
  167. {
  168. cout << "input the infix expression:(you must input # to stop input)" << endl;
  169. LinkStack* SOPTR = new LinkStack;
  170. LinkStack* SOPND = new LinkStack;
  171. evaluate(SOPTR, SOPND);
  172.  
  173. return 0;
  174. }

  

Infix to postfix conversion 中缀表达式转换为后缀表达式的更多相关文章

  1. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  2. 练习3.20 a 将中缀表达式转换为后缀表达式

    //将中缀表达式转换为后缀表达式 int main() { ; ]={,,,,,,,}; char tmp; PtrToStack s; s = CreateStack( MaxSize ); ) { ...

  3. 栈的应用实例——中缀表达式转换为后缀表达式

    声明:本程序读入一个中缀表达式,将该中缀表达式转换为后缀表达式并输出后缀表达式. 注意:支持+.-.*./.(),并且输入时每输入完一个数字或符号都要加一个空格,特别注意的是在整个表达式输入完成时也要 ...

  4. 数据结构Java实现06----中缀表达式转换为后缀表达式

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  5. 中缀表达式转换为后缀表达式(python实现)

    中缀表示式转换为后缀表达式 需要一个存放操作符的栈op_stack,输出结果的列表output 步骤: 从左到右遍历表达式: 1. 若是数字,直接加入到output 2. 若是操作符,比较该操作符和o ...

  6. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值

    1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...

  7. NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  8. 中缀表达式得到后缀表达式(c++、python实现)

    将中缀表达式转换为后缀表达式的算法思想如下: 从左往右开始扫描中缀表达式 遇到数字加入到后缀表达式 遇到运算符时: 1.若为‘(’,入栈 2.若为’)‘,把栈中的运算符依次加入后缀表达式,直到出现'( ...

  9. 3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-06 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式. 日常使用的算术表达式是採用中缀表示法,即二元运算符位于两 ...

随机推荐

  1. Linux下各类压缩文件命令小结

    .tar 解包:tar xvf FileName.tar    解包后原始文件仍存在 打包:tar cvf FileName.tar DirName1 Filename1 - 列出内容:tar tvf ...

  2. Linux操作系统信息查看命令

    1. 查看系统内核信息 uname -a 2. 操作系统版本  cat /etc/issue | grep Linux 3. 查看CPU型号 cat /proc/cpuinfo | grep name ...

  3. hdu1025

    #include<stdio.h>const int MAXN=500010;int a[MAXN],b[MAXN]; //用二分查找的方法找到一个位置,使得num>b[i-1] 并 ...

  4. hdu1022

    #include <stdio.h>#include <string.h> int main(void){ int n,i,j,k,l; char o1[10],o2[10], ...

  5. Html网页的代码

    Html网页的代码 很全哦 1)贴图:<img src="图片地址"> 2)加入连接:<a href="所要连接的相关地址">写上你想写 ...

  6. MVC写在Model文件夹下,登录注册等页面定义的变量规则,不会被更新实体模型删除

    一下图为我的model文件夹

  7. 《JS权威指南学习总结--6.8对象的三个属性》

    内容要点: 每一个对象都有与之相关的原型(prototype).类(class)和可扩展性 一.原型属性 1.对象的原型属性是用来继承属性的,这个属性是如此重要,以至于我们经常把 "0的原型 ...

  8. button,input type=button按钮在IE和w3c,firefox浏览器区别

    在项目中遇到一个问题,是关于点击button按钮会自动刷新的问题.查阅了资料,做以下的整理: button,input type=button按钮在IE和w3c,firefox浏览器区别如下:当在IE ...

  9. oracle动态视图v$,v_$,gv$,gv_$与x$之间的关系

    前言:在oracle运维的过程中,经常会使用到一些以V$开头的动态视图,比如V$session, 有一次偶然看到有人用V_$session, 初以为别人写错了,没想到desc v_$session以后 ...

  10. WiMAX协议栈

    1.协议栈模型 协议栈模型将 WiMAX 系统分为数据控制平面和管理平面两个平面 数据控制平面对数据的正确传输进行保证,包括封装.分片.加密.解封装等 基站与用户站之间的特定信令交互完成系统的控制功能 ...