数据结构 栈解析 算法表达式

1 本文目标

分析用堆栈解析算术表达式的基本方法。给出的示例代码能解析任何包括+,-,*,/,()和0到9数字组成的算术表达式。

2 中缀表达式和后缀表达式

中缀表达式就是通常所说的算术表达式,比如(1+2)*3-4。

后缀表达式是指通过解析后,运算符在运算数之后的表达式,比如上式解析成后缀表达式就是12+3*4-。这种表达式可以直接利用栈来求解。

3 运算符的优先级

优先级 运算符
1 括号()
2 负号-
3 乘方**
4 乘*,除/,求余%
5 加+,减-
6 小于<,小于等于<=,大于>,大于等于>=
7 等于==,不等于!=
8 逻辑与&&
9 逻辑或||

大致的规律是,一元运算符 > 二元运算符 > 多元运算符。

4 利用堆栈解析算术表达式的过程

中缀表达式翻译成后缀表达式的方法如下:

(1)从右向左依次取得数据ch。

(2)如果ch是操作数,直接输出。

(3)如果ch是运算符(含左右括号),则:
      a:如果ch = ‘(‘,放入堆栈。
      b:如果ch = ‘)‘,依次输出堆栈中的运算符,直到遇到‘(‘为止。
      c:如果ch不是‘)‘或者‘(‘,那么就和堆栈顶点位置的运算符top做优先级比较。
          1:如果ch优先级比top高,那么将ch放入堆栈。
          2:如果ch优先级低于或者等于top,那么输出top,然后将ch放入堆栈。

(4)如果表达式已经读取完成,而堆栈中还有运算符时,依次由顶端输出。

如果我们有表达式(A-B)*C+D-E/F,要翻译成后缀表达式,并且把后缀表达式存储在一个名叫output的字符串中,可以用下面的步骤。

(1)读取‘(‘,压入堆栈,output为空
(2)读取A,是运算数,直接输出到output字符串,output = A
(3)读取‘-‘,此时栈里面只有一个‘(‘,因此将‘-‘压入栈,output = A
(4)读取B,是运算数,直接输出到output字符串,output = AB
(5)读取‘)‘,这时候依次输出栈里面的运算符‘-‘,然后就是‘(‘,直接弹出,output = AB-
(6)读取‘*‘,是运算符,由于此时栈为空,因此直接压入栈,output = AB-
(7)读取C,是运算数,直接输出到output字符串,output = AB-C
(8)读取‘+‘,是运算符,它的优先级比‘*‘低,那么弹出‘*‘,压入‘+",output = AB-C*
(9)读取D,是运算数,直接输出到output字符串,output = AB-C*D
(10)读取‘-‘,是运算符,和‘+‘的优先级一样,因此弹出‘+‘,然后压入‘-‘,output = AB-C*D+
(11)读取E,是运算数,直接输出到output字符串,output = AB-C*D+E
(12)读取‘/‘,是运算符,比‘-‘的优先级高,因此压入栈,output = AB-C*D+E
(13)读取F,是运算数,直接输出到output字符串,output = AB-C*D+EF
(14)原始字符串已经读取完毕,将栈里面剩余的运算符依次弹出,output = AB-C*D+EF/-

5 计算算术表达式

当有了后缀表达式以后,运算表达式的值就非常容易了。可以按照下面的流程来计算。

(1)从左向右扫描表达式,一个取出一个数据data
(2)如果data是操作数,就压入堆栈
(3)如果data是操作符,就从堆栈中弹出此操作符需要用到的数据的个数,进行运算,然后把结果压入堆栈
(4)如果数据处理完毕,堆栈中最后剩余的数据就是最终结果。

比如我们要处理一个后缀表达式1234+*+65/-,那么具体的步骤如下。

(1)首先1,2,3,4都是操作数,将它们都压入堆栈
(2)取得‘+‘,为运算符,弹出数据3,4,得到结果7,然后将7压入堆栈
(3)取得‘*‘,为运算符,弹出数据7,2,得到数据14,然后将14压入堆栈
(4)取得‘+‘,为运算符,弹出数据14,1,得到结果15,然后将15压入堆栈
(5)6,5都是数据,都压入堆栈
(6)取得‘/‘,为运算符,弹出数据6,5,得到结果1.2,然后将1.2压入堆栈
(7)取得‘-‘,为运算符,弹出数据15,1.2,得到数据13.8,这就是最后的运算结果

原文地址:https://www.cnblogs.com/zquan/p/9368653.html

时间: 2024-10-09 09:32:19

数据结构 栈解析 算法表达式的相关文章

数据结构 栈的应用 --表达式求值

一: 中缀表达式求值  思想: 需要2个栈,运算对象栈OPND,运算符栈OPTR, 1:将栈OPND初始化为空,栈OPTR初始化为表达式的定界符# 2:扫描表达式,直到遇到结束符# 2.1:当前字符是运算对象,入栈OPND 2.2:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级高,入栈OPTR,处理下一个字符 2.3:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级低,则从栈OPND出栈2个运算对象,从栈OPTR出栈一个运算符进行运算,并将运算结果入栈OPND,处理当前字符 2.4

算法学习记录-栈的应用--表达式运算

前面做了栈的基本操作 总感觉需要做一个实际的例子来检验一下. 这里我将用栈来做一个简单的四则运算. 目标比较简单: 做一个带小括号(“()”)的四则运算,如果要加入到中括号(“[]”)或者大括号(“{}”),依次类推. 求一个表达式: 用下面这个算是做例子,程序最后应该可以算出任何带小括号的运算. 3+(32-6)*9+5*3-(3*(65-15)/5)+12; 方法一:后缀法. 1.了解中缀和后缀表示法 中缀表示法:刚才的那个算是就是中缀表示法,我们通常看到的数学符号就是中缀表示法,即数字在计

数据结构实验:计算表达式的值--顺序栈

实验题目:栈的应用-算术表达式求值 实验环境:    Visual C++ 6.0                   实验目的 : 1 .掌握栈的定义及实现: 2 .掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法.对算法3.4中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符: (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级: (3) 函数Operate(a,theta,b):对

数据结构——栈和队列相关算法实现

数据结构栈和队列的基本算法实现 限定性线性表--栈 栈的定义 栈作为一种限定性的线性表,是将线性表的插入和删除操作限制为仅在表的一端进行. 基本算法演示 /* 栈的常见操作: 1.初始化栈 2.元素进栈 3.元素出栈 4.栈的遍历 5.判断栈是否为空栈 6.清空整个栈 */ # include <stdio.h> # include <stdlib.h> typedef struct Node { int date; struct Node * pNext; }NODE,* PNO

使用栈实现解析算术表达式

目的 1. 使用栈将中缀表达式转换成后缀表达式 2. 使用后缀表达式求算术值 注意: 因为是简单实践,所以代码逻辑已经简化,比如只能对个位数的加减乘除进行解析.没有设异常处理等 一:需要实现一个栈 这个没什么好说的,只是一个结构很简单的栈 1 public class Stack { 2 3 private int maxSize; 4 private int top; 5 private Object[] stackArr; 6 7 public Stack(int maxSize) { 8

数据结构-栈的实现之括号匹配检测

假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先检测栈是否为空, 若栈空则表明此右括弧多余,表达式不匹配. 否则和栈顶数据比较,若匹配则栈顶出栈. 否则表明表达式不匹配: 最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配. 实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作

第14课 计算器核心解析算法(下)

1. 中缀到后缀的手工转换 (1)按优先级给表达式加括号 (2)从内向外将运算符移动对应的括号后面 (3)去括号,即可得到后缀表达式(如下图,图中数字表示转换顺序) 2. 后缀表达式求值 2.1 图解后缀表达式求值过程 (1)从左向右扫描后缀表达式. (2)遇到数字直接进栈 (3)重点在于遇到运算符时,要找到其左右操作数.(此图中有5个运算符,分别是*./.-.*.+) 2.2 求值步骤(利用栈来进行运算,注意栈只用来保存操作数,并不保存操作符) (1)当前元素为数字:进栈 (2)当前元素为运算

堆栈解析算术表达式

利用栈,解析算术表达式问题就立刻变得容易许多.给出的示例代码能解析任何包括+,-,*,/,()和0到9数字组成的算术表达式. 中缀表达式和后缀表达式中缀表达式就是通常所说的算术表达式,比如(1+2)*3-4.后缀表达式是指通过解析后,运算符在运算数之后的表达式,比如上式解析成后缀表达式就是12+3*4-.这种表达式可以直接利用栈来求解. 运算符的优先级 优先级 运算符 1 括号() 2 负号- 3 乘方** 4 乘*,除/,求余% 5 加+,减- 6 小于<,小于等于<=,大于>,大于等

双栈计算算术表达式

1.介绍 算术表达式的计算,是比较常见的问题,但这个问题的背后隐藏着栈的思想. 这里就介绍使用两个栈来计算表达式的方法. 2. 算法 2.1 定义: a) 建立两个栈: 一个是数据栈dataStak,用于存放数据: 一个是符号栈operatorStack,用于存放运算符: b) 建立运算符号之间的优先级表,用于比较两个符号之间的优先级: 优先级定义为三种运算结果:>(表示高于),<(表示低于),=(表示相等): 并且对于"("与")",认为两者的优先级相