2019独角兽企业重金招聘Python工程师标准>>>

后缀表达式求值算法

stack operands;  //运算数栈
while(没到表达式尾)
{scanf("一个运算对象op");if(op is 运算数)operands.push(op);else if(op is 运算符){operand_right = operands.pop();operand_left = operands.pop();result = operand_left op operand_right;operands.push(result);}else{printf("Suffix expression is invalid !");}
}
if(operands.size() == 1)return operands.top();
elseprintf("Suffix expression is invalid!");

前缀表达式求值算法

算法一:从表达式尾部开始处理(从右至左)

伪代码描述:

stack operands;   //运算数栈
while(没到达表达式首)
{scanf("一个运算对象op");if(op is Operand)operands.push(op);else if(op is Operator){operand_left = operands.pop();operand_right = operands.pop();result = operand_left op operand_right;operands.push(result);}else{printf("Prefix expression is invalid!");}
}
if(operands.size() == 1)
{return operands.top();
}
elseprintf("Prefix expression is invalid!");

算法二:从表达式首部开始处理(从左至右)

stack operations;  //运算对象栈,元素既可以是云算法,也可以是运算数
while(没到表达式尾)
{scanf("一个运算对象op");if(op is Operator){operations.push(op);}else if(op is Operand){if(operations.top() is Operator){operations.push(op);}else{while(operations.top() is Operand){operand_right = op;operand_left = operations.pop();operator = operations.pop();op = operand_left operator operand_right;}operations.push(op);}}else{printf("Prefix expression is invalid!");}
}
if(operations.size() == 1)return operations.top();
elseprintf("Prefix expression is invalid!");

中缀表达式转换为后缀表达式算法

stack operators;   //运算符栈
while(没到表达式尾)
{scanf("一个运算对象op");if(op is Operand){printf(op);}else if(op is Operator){if(op 优先级大于 operator.top() && op is not 右括号)operator.push(op);else if(op is 右括号){do{tmp = operators.pop();if(tmp is not 对应左括号){printf(tmp);}else{break;}if(operators.empty()){printf("Infix expression is invalid!");}}while(1);}else{do{tmp = operators.pop();printf(tmp);}while(op 优先级小于 operators.top());operators.push(op);}}else{printf("Infix expression is invalid!");}
}
while(!operators.empty())
{tmp = operators.pop();printf(tmp);
}

中缀表达式转换为前缀表达式算法

从表达式尾部开始处理

stack operators;  //运算符栈stack operations;  //运算对象栈,元素既可以是运算符,也可以是运算数while (没到表达式首){scanf("一个运算对象op");if (op is Operand){operations.push(op);}else if (op is Operator){if (op 优先级大于 operators.top() && op is not 左括号)operators.push(op);else if (op is 左括号){do{tmp = operators.pop();if (tmp is not 对应右括号){operations.push(tmp);}else{break;}if (operators.empty()){printf("Infix expression is invalid!");}}while(1);}else{do{tmp = operators.pop();operations.push(tmp);}while(op 优先级小于 operators.top());operators.push(op);}}else{printf("Infix expression is invalid!");}}while(!operators.empty()){tmp = operators.pop();operations.push(tmp);}while(!operations.empty()){tmp = operations.pop();printf(tmp);}

转载于:https://my.oschina.net/lucusguo/blog/506528

表达式求值及转换算法相关推荐

  1. 后缀表达式求值和转换(C++)

    中缀转后缀 #include<stdio.h> #include<stack> using namespace std; stack<int> s; int com ...

  2. 数据结构 C++实现 算术表达式求值

    文章目录 一.实验目的 二.实验要求 三.代码内容 1.创建链栈并初始化 2.入栈出栈取栈顶元素 3.判断是否是运算符 4.判断运算符优先级 5.运算函数 6.总代码 四.运算结果 五.总结 一.实验 ...

  3. python 表达式求值_简单算术表达式求值

    本文主要探讨简单的数学算术表达式求值算法的原理和实现. 1. 约束 本文只是探讨简单的算术表达式的求值算法,为了将主要精力放在算法思想的探讨和实现上,避免陷入对其他不是直接相关的细节的过多思考,所以提 ...

  4. python前缀表达式求值_python数据结构与算法 11 后缀表达式求值

    从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...

  5. python 表达式求值数据结构_python 数据结构与算法

    python 数据结构与算法 1 python常见数据结构性能 1.1 List 1.1.1 安索引取值和赋值 1.1.2 列表append和__add__() 1.1.3 使用timeit模块测试执 ...

  6. c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)

    第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...

  7. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  8. 字符串算术表达式求值-简单计算器实现(栈)-数据结构和算法(Java)

    1 字符串算术表达式分类 字符串算术表达式分为前缀表达式.中缀表达式和后缀表达式.其中前缀表达式又称波兰表达式,后缀表达式基于前缀表达式,又称逆波兰表达式.下面给出百度百科关于几种表达式的定义: 前缀 ...

  9. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

最新文章

  1. java c 序列化_Java 序列化
  2. Simulink仿真 第九节 时间延迟模块
  3. 关于Android消息机制你所需要知道的
  4. Java 条件编译 Conditional Compilation
  5. [C++对象模型][9]虚继承与虚函数表
  6. 如何打开eclipse进行编写Java程序
  7. Linux 笔记 :FHS目录笔记
  8. POJ 计算几何专项训练(2) 【1269】【1410】【1696】【3347】【2826】
  9. 经典算法-(一)汉诺塔(河内之塔)
  10. spring和mybatis整合代码
  11. 详解透明网桥的三个功能
  12. oracle经典分数排名,力扣数据库题目: 分数排名(中等)
  13. 微信视频号绑定公众号教程分享
  14. 手机端与PC端在线预览PDF
  15. Android 相机教程,Android 相机教程
  16. JAVA之父----James Gosling(詹姆斯·高斯林)
  17. 【Web Development - AnnihilateSword】03 - Intermediate HTML
  18. 100个球两个人轮流拿,每次最多拿n个,谁拿到最后一个球获胜
  19. 【opencv初学者】2、视频的读取
  20. 十种燃烧卡路里减肥运动方法

热门文章

  1. 83. 删除排序链表中的重复元素 golang
  2. 【剑指offer】_18 数据流中的中位数
  3. 每日一题:leetcode724.寻找数组的中心索引
  4. 数据可视化【八】根据数据类型选择可视化方式
  5. HDU4812-D Tree-树分治
  6. POJ 3696 欧拉函数+快速幂
  7. 从0到1写RT-Thread内核——支持多优先级
  8. linux syslog服务器配置,自动发日志到另一台日志服务器
  9. java小程序小游戏代码贪吃蛇,附高频面试题合集
  10. 什么是 DDoS 攻击?