美文网首页
计算中缀表达式 - 调度场算法

计算中缀表达式 - 调度场算法

作者: d394af621d4c | 来源:发表于2017-12-12 01:10 被阅读79次

简介

调度场算法(Shunting Yard Algorithm)是由Edsger Wybe Dijkstra引入的用于将中缀表达式转换成后缀表达式的经典算法。后缀表达式也称为逆波兰表达式。

目标

输入一个表达式字符串,计算其结果。表达式中数字包括:整数,小数;运算符包括:"+","-","*","/","(",")"

调度场算法原理

准备一个队列,用于存放后缀表达式。准备一个栈,用于存放运算符。从左到右遍历中缀表达式,如果是数字直接加入到队列中,即成为后缀表达式的一部分。

如果是运算符,则判断与栈顶运算符的优先级:

优先级>栈顶运算符或者栈顶是左括号,则直接压入栈内;

优先级<=栈顶运算符,则栈顶运算符依次出栈并加入到队列中,并将当前运算符进栈。(这里等号保证了连加这种情况是从左到右进行的)

对于左括号直接压入栈内,对于右括号不停弹出栈内运算符,直到找到左括号。

最后将所有栈内运算符依次出栈,加入到队列中。

举例说明

输入字符串: 3 + 3 * ( 6 - 1 * 2 ) / 4 - 1

输入 动作 输出(后缀表达式) 运算符栈 备注
3 数字加入队列中 3
+ 运算符入栈 3 +
3 数字加入队列中 3 3 +
* 运算符入栈 3 3 * + *优先级高于+
( 运算符入栈 3 3 ( * + ( 直接进栈
6 数字加入队列中 3 3 6 ( * +
- 运算符入栈 3 3 6 - ( * + 括号优先级高于+ - * /
1 数字加入队列中 3 3 6 1 - ( * +
* 运算符入栈 3 3 6 1 * - ( * +
2 数字加入队列中 3 3 6 1 2 * - ( * +
) 不停出栈,直到( 3 3 6 1 2 * - * +
/ 运算符入栈 3 3 6 1 2 * - / * +
4 数字加入队列中 3 3 6 1 2 * - 4 / * +
- 栈顶出栈两个,并加到队列中 3 3 6 1 2 * - 4 / * - +
1 数字加入队列中 3 3 6 1 2 * - 4 / * 1 + +
END 栈依次出栈加入队列 3 3 6 1 2 * - 4 / * 1 - +

相关文章

  • 计算中缀表达式 - 调度场算法

    简介 调度场算法(Shunting Yard Algorithm)是由Edsger Wybe Dijkstra引入...

  • 逆波兰式

    逆波兰式,是编程计算四则运算结果的算法。例子:平时写法a+b(中缀表达式),逆波兰式ab+。把中缀表达式编程后缀表...

  • 前缀中缀和后缀表达式

    中缀 人类正常使用的计算表达式即为中缀表达式比如:( 1 + 2 ) * 3 - 4 前缀 前缀表达式的计算逻辑为...

  • 栈和队列

    一.栈 栈的作用之一:利用栈后进先出的特点匹配括号,计算带运算符的算法(也就是中缀表达式) 可以把中缀表达式转化为...

  • 中缀表达式

    学习算法,开始想到用栈了,但是没有解决优先级的问题。上网一查,原来中缀表达式更适合计算机阅读,转换成中缀表达式后,...

  • 堆栈

    堆栈中常见的问题: 问题1: 后缀表达式怎么计算?问题2: 中缀表达式怎么转换成后缀表达式?问题3: 回溯算法问题...

  • C语言中缀表达式计算器

    本文将介绍中缀表达式计算器的详细写法,是 C语言把中缀表达式转换为后缀表达式 和 C语言逆波兰计算器 的结合 ...

  • [堆栈] 前, 中, 后缀表达式

    将中缀表达式转换成后缀表达式(逆波兰式), 便于计算机的计算.

  • 利用栈将中缀表达式转为后缀表达式

    利用栈将中缀表达式转为后缀表达式 算法思想 顺序扫描中缀表达式(可以存储在字符数组中) 判断当前元素类型:如果是数...

  • Python 简单计算器-逆波兰后缀表达式实现

    中缀表达式 后缀表达式 简易计算器,可以通过栈来实现。然而如果直接使用中缀表达式,需要处理括号,而使用后缀表达式则...

网友评论

      本文标题:计算中缀表达式 - 调度场算法

      本文链接:https://www.haomeiwen.com/subject/lmbwixtx.html