后缀表达式求值:

后缀表达式是无需进行处理可以直接被计算机处理的表达式,运算符通常位于操作数的后面,例如: 3 4 + 5 * 6 -   ,它是由中缀表达式(3 + 4) × 5 - 6转换过来的

后缀表达式进行求值时,设立一个栈s1,从左到右依次访问表达式中的元素,如果遇到数字直接压入栈中,如果遇到运算符就将栈中最上方的两个元素取出后进行相应的运算,将运算结果压入栈中。具体c++代码如下:

#include <iostream>
#include <stack>
#include <string>using namespace std;int main()
{string s;getline(cin,s);        //这里需要注意,因为输入的后缀表达式操作数与运算符之间有空格隔开,因此不能用cin或者scanf进行读入int len = s.size();     // cin或者scanf读入时,遇到空格就会判定为结束int a,b;stack<int> t;int i;for (i = 0;i < len;i++){if (s[i] == '+' ||s[i] == '-' ||s[i] == '*' ||s[i] == '/' ){if (s[i] == '+'){a = t.top();t.pop();b = t.top();t.pop();a = a + b;t.push(a);}else if (s[i] == '-'){a = t.top();t.pop();b = t.top();t.pop();a = b - a;t.push(a);}else if (s[i] == '*'){a = t.top();t.pop();b = t.top();t.pop();a = a * b;t.push(a);}else if (s[i] == '/'){a = t.top();t.pop();b = t.top();t.pop();a = b / a;t.push(a);}i++;}else{int sum = 0;while (s[i] != ' '){sum *= 10;sum += (s[i] - '0');i++;}t.push(sum);}}cout << t.top() << endl;
}

中缀表达式转换成后缀表达式

中缀表达式在求值时往往要先转换成相对应的后缀表达式,具体的做法是

1.设立两个栈t1,t2,分别用来存放运算符和操作数

2.从左至右扫描中缀表达式;

3.遇到操作数时,将其压入t2;
4.遇到运算符时,进行如下处理:
4-1.如果t1为空,或栈顶运算符为左括号“(”,或者该运算符为'(',则直接将此运算符入栈;
4-2.如果运算符为‘)’,那么依次将t1中的运算符弹出,压入t2,直到遇到一个‘(’,将它消除;

4-3.否则,将它与栈顶的运算符的优先级进行比较:

4-3-1.如果它的优先级大于栈顶运算符优先级,那么直接压入t1;

4-3-2.如果它的优先级小于栈顶运算符优先级,那么依次将t1中的运算符弹出,压入t2,直到遇见比它优先级小的,或者栈空,或者遇到‘(’,将它压入t1;

5.依次遍历完整个中缀表达式,栈t2中存放的就是所求的后缀表达式;

#include <iostream>
#include <stack>
#include <vector>using namespace std;bool judge1(char s)
{if (s == '+' || s == '-' || s == '*' || s == '/' || s == '(' || s == ')') return true;else return false;
}int getOp (char s)
{if (s == '+') return 0;else if (s == '-') return 1;else if (s == '*') return 2;else if (s == '/') return 3;
}int op[4][4] = {0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0};bool judge2(char a,char b)
{int op1 = getOp(a);int op2 = getOp(b);if (op[op1][op2] == 1) return true;else return false;
}int main()
{char k;vector<char> s;while (scanf("%c",&k) != '\n')     //这里其实有个很严重的错误,在读入中缀表达式的时候,操作数和运算符之间是有空格的,因此不能用cin或者是scanf{s.push_back(k);                // 而必须使用getline()或者是gets() , 不过我懒得改了,具体可以参考上面的后缀表达式求值 }int len = s.size();  stack<char> t1;stack<char> t2;for (int i = 0;i < len;i++){bool temp1 = judge1(s[i]);if (!temp1){t2.push(s[i]);}else{if (s[i] == '(' || t1.empty() || t1.top() == '('){t1.push(s[i]);}else if(s[i] == ')'){while (t1.top() != '('){char ex = t1.top();t2.push(ex);t1.pop();}t1.pop();}else{bool temp2 = judge2(s[i],t1.top());if (temp2){t1.push(s[i]);}else{while (!t1.empty() && !judge2(s[i],t1.top()) && t1.top() != '('){char tt = t1.top();t2.push(tt);t1.pop();}t1.push(s[i]);}}}}while (!t1.empty()){char xx = t1.top();t2.push(xx);t1.pop();}stack<char> out;while (!t2.empty()){char xx = t2.top();out.push(xx);t2.pop();}while (!out.empty()){cout << out.top();out.pop();}cout << endl;
}

前缀表达式求值:

前缀表达式求值和后缀表达式求值方法很相似,只不过前缀表达式求值是从右往左扫描表达式,遇到操作数则压入栈中,遇到运算符则弹出两个操作数计算结果后重新压入

中缀表达式转前缀表达式:

与中缀转后缀相似,只说明一下不同点:

1.中缀转前缀是从右到左扫描

2.在中缀转后缀中,如果运算符比栈顶运算符的优先级高,则压入栈中,否则要依次弹出运算符栈中的元素,直到栈顶元素优先级比它低;而在中缀转前缀时,这一规则改变为如 果运算符比栈顶运算符的优先级高或它们的优先级相等,则压入栈中。












												

前缀、中缀、后缀表达式归纳相关推荐

  1. python【数据结构与算法】表达式(前缀中缀后缀表达式)与Two fork tree

    文章目录 1 相关概念 2 与二叉树关系 3 表达式转换 4 另一种方法 1 相关概念 前缀表达式(Prefix Notation)是指将运算符写在前面操作数写在后面的不包含括号的表达式,而且为了纪念 ...

  2. 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)

    前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4  对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...

  3. 前缀中缀后缀表达式的计算求值

    原文在这里 表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式求值 ...

  4. 表达式树前缀中缀后缀表达式

    表达式树( expression tree ), 表达式树的树叶是操作数( operand ),比如常数或变量,而其他的节点为操作符( operator )如: 由于这里所有的操作都是二元的,因此这棵 ...

  5. 前缀 中缀 后缀表达式2

    对于未经训练的用户来说,计算机科学领域中数学表达式求值的传统方法即不顺手又难以使用:软件工程师 Nikola.Stepan 旨在改变这些传统方法.他的 applet W3Eval 对表达式求值与您用纸 ...

  6. 前缀中缀后缀表达式介绍

    一 前缀表达式 1 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前. 2 举例 (3+4)×5-6 对应的前缀表达式是: - × + 3 4 5 6 3 前缀表达式的计算机求值过程 从右至左扫 ...

  7. 前缀 中缀 后缀表达式

    1.前缀表达式叫波兰式,后缀叫逆波兰式 2.中缀表达式转另外两个比较简单,前后缀装中缀较麻烦 3.问题分求表达式还是求值,如果是求值则需要两个栈,一个是操作符栈,一个是操作数栈,等操作符栈入栈完毕后依 ...

  8. C#数据结构-前缀中缀后缀+中缀转后缀

    目录 一.前缀中缀后缀表达式 1.中缀表达式 2.前缀表达式 3.后缀表达式 二.中缀转后缀 一.前缀中缀后缀表达式 1.中缀表达式 中缀表达式就是平常生活中计算式子的写法,例如:(3+4)*5-6  ...

  9. 中缀表达式转换为前缀及后缀表达式并求值【摘】

    它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) ...

  10. 中缀表达式转换为前缀或后缀表达式的手工做法

    以 a/b + ( c*d - e*f) / g 为例: 步骤1:按照运算符的优先级对所有的运算单元加括号. ((a/b) + (( (c*d) - (e*f)) / g)) 步骤2:转换为前缀或后缀 ...

最新文章

  1. 万年历的设计c语言,万年历设计报告
  2. Activity与Service通信
  3. jQuery序列化表单 serialize() serializeArray()
  4. Spring中策略模式实现方法
  5. linux内核函数open源码,open()在Linux内核的实现(1)-基本实现
  6. javascript 分号_让我们谈谈JavaScript中的分号
  7. 做柱状图加数据标签_Origin绘图:如何优雅的绘制堆叠柱状图
  8. 巧用vim+sed整理shell脚本文件
  9. python 获取当前目录,上级目录,上上级目录
  10. Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_汇总贴
  11. linux 区别 挂起 阻塞_踩坑之java执行linux命令死锁阻塞挂起
  12. 手机微信如何设置浏览器打开时提醒
  13. DELPHI源码防QQ截屏区域截图全屏截图框架
  14. 关于Android 启动页加载先预加载系统白页问题
  15. 史上最好听的十首纯音乐推荐
  16. 【渝粤教育】广东开放大学 质量认证认可 形成性考核 (31)
  17. 国科大英语Unit4
  18. HRM人力资源系统-Day13
  19. Google广告投放技巧,开始Google广告投放
  20. matlab 伯德图 横坐标步长_使用MATLAB的m函数画伯德图,设置显示横坐标为HZ

热门文章

  1. layui table 头部工具栏右侧图标隐藏,增加
  2. 云客Drupal源码分析之类型化数据Typed Data API
  3. 金蝶云星空添加基础资料属性
  4. Android模拟器之Genymotion使用教程(一)
  5. 腾讯内部转岗_学员故事丨从视觉设计到原型设计,他是如何从UI成功转岗产品的?...
  6. IP地址是如何分配的?
  7. mybatis01-关于从数据库查询数据出现@569cfc36
  8. 我走了,青春留给北京——第三方视角解读从菜鸟到专家@衍水狂客
  9. K8S进阶之-卷类型
  10. 鲁班学院java高级架构师_鲁班学院java三期架构师