顺序栈实现表达式求值(C语言实现)【栈】

  • 原理说明
  • 代码实现

原理说明

表达式求值一定会出现表达式中运算符的优先级问题。

运算规则:
先乘除,后加减;
从左算到右;
先括号内,后括号外;

运算符优先表:
顺序栈实现表达式求值(C语言实现)【栈】_第1张图片
上面表格中有一些比较特殊的位置:
① 相等 = 左括号遇到右括号相等说明左右括号匹配。

① # 和 # 遇到的时候也是 = ,我们在表达式的左边人为的加上一个 # ,在表达式扫描完成之后再加上一个 # 表示表达式扫描完了。

③ 上面表格中出现的空白部分表示运算符遇到之后是毫无逻辑的,括号必须是相互匹配的,# 也必须是成对出现。

求表达式 4 + 2 * 3 - 10 / 5 的值。
计算顺序为:
4 + 2 * 3 - 10 / 5 =
4 + 6 - 10 / 5 =
10 - 10 / 5
= 10 - 2
= 8

上面的计算结果我们不去考虑,主要去考虑上面表达式运算的过程。

先定义一个栈用来存储操作数或结果:
顺序栈实现表达式求值(C语言实现)【栈】_第2张图片

定义另一个栈来存储运算符:
顺序栈实现表达式求值(C语言实现)【栈】_第3张图片

过程:
读入的运算符优先级比运算符栈顶元素的优先级高就入栈。
读入的运算符优先级比运算符栈顶元素的优先级低就弹出栈顶元素,然后弹出两个操作数进行计算,然后把计算结果入操作数或结果栈,然后继续向后读取进行判断。

 # 入运算符栈 , 4 入操作数或结果栈。
 运算符栈顶 # < + , + 入运算符栈。
 2 入操作数或结果栈。
 栈顶 + < * , * 入运算符栈。
 3 入操作数或结果栈。
 栈顶 * > - ,  运算符 * 出栈,操作数 2 3 出栈进行 * 运算。
 运算的结果 6 入操作数或结果栈。
 栈顶 + > - , 运算符 + 出栈,操作数 4 6 出栈进行 + 运算。
 运算的结果 10 入操作数或结果栈。
 运算符栈顶 # < - , - 入运算符栈。
 10入操作数或结果栈。
 运算符栈顶 - < / , / 入运算符栈。
 5入操作数或结果栈。
 运算符栈顶  / > # , 运算符 / 出栈,操作数 5 10 出栈进行 / 运算。
 运算的结果 2 入操作数或结果栈。
 运算符栈顶  - > # , 运算符 - 出栈,操作数 2 10 出栈进行 - 运算。
 运算的结果 8 入操作数或结果栈。
 运算符栈顶 # 遇到 # 相等,表达式求完。
 操作数或结果栈中是数据元素就是表达式计算完成之后的结果。

代码实现

你可能感兴趣的:(顺序栈实现表达式求值(C语言实现)【栈】)