代码中采用了三步实现算术表达式的解析:
1. 将算术表达式(字符串)转换成一个列表parseElement方法
2. 将列表表示的算术表达式转换成后缀表达式changeToSuffix
3. 计算后缀表达式的结果
这里我是为了方便, 就写了个parseElement, 不想那方法写到后面却把自己绕住了, 可以想象一个带自增, 位, 逻辑, 算术的表达式的数值提取是多么的复杂...
parseElement自己感觉是一个比较失败的方法, 所以从一个普遍的角度来分析以下算术表达式的解析:
以(A + B) * C / D ** E + F * G为例
第一部分: 将中缀表达式(上面就是, 具体去查有关前缀, 中缀, 后缀表达式)
这一步需要一个栈用来保存运算符, 一个字符串用来保存输出的后缀表达式
符号栈: signStack
后缀表达式: result
过程: 读取表达式中每个元素(数字或运算符, 我的parseElement意在解决这个问题, 却做的不成功)
原则:
1. 操作数直接输出到result
2. (直接进栈
3. )出栈直到遇到一个"("(注意: 这里"("必须出栈), 中间出栈的元素按出栈顺序输出到result
4. 其他运算符, 检查栈顶元素, 如果栈顶比当前运算符优先级高或相同(优先级相同, 按顺序执行)则先将栈顶出栈, 再入栈. 如果当前元素优先级高, 则直接入栈.
操作过程的状态变化
signStack |result |current char
------------------------------------------------------
( | |(
( |A |A
(, + | |+
( |AB |B
|AB+ |)
* | |*
* |AB+C |C
/ |AB+C* |/
/ |AB+C*D |D
/, **|AB+C*D |**
/, **|AB+C*DE |E
+|AB+C*DE**/ |+
+|AB+C*DE**/F |F
+, * |AB+C*DE**/F |*
|AB+C*DE**/FG*+ |G
唉, 不太美观啊..
第二部分: 计算后缀表达式(AB+C*DE**/FG*+)
这一步需要一个栈用来保存操作数
值栈
过程: 读取后缀表达式中每个元素
原则:
1. 操作数直接进栈
2. 遇到一个运算符则出栈两个, 计算结果再进栈
操作过程的状态变化
stack |current char
------------------------------------------------------
A |A
A, B |B
(A+B) |+
(A+B), C |C
(A+B)*C |*
((A+B)*C), D |D
((A+B)*C), D, E |E
((A+B)*C), (D**E) |**
(((A+B)*C)/(D**E))|/
(((A+B)*C)/(D**E)), F |F
(((A+B)*C)/(D**E)), F, G |G
(((A+B)*C)/(D**E)), (F*G) |*
((((A+B)*C)/(D**E))+(F*G)) |+
还是不很美观哈, 呵呵, 逗号把元素隔开, 应该还是可以看的比较清晰了...呵呵..
分享到:
相关推荐
用栈解析算术表达式,并且做到了多位数运算,运算包括加、减、乘、除、求余
实验题目: 基于栈的算术表达式求值算法 实验环境: 学习完了数据结构第三章内容栈和队列 实验目的: 1.掌握栈的定义及实现; 2.掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法...
使用栈结构解析算术表达式,加、减、乘、除、求余,并支持多位数运算
掌握基于栈实现算术表达式求值的原理和算法。 使用VC++语言编写程序,根据数据结构中栈的的逻辑特性和物理存储结构,使用栈实现考虑算符优先的算术表达式求值算法,编译运行程序。
数据结构利用栈实现算术表达式的求值 C语言版 正号、负号、加、减、乘、除和求模,可包括括号
1.通过修改完善课件案例 3.3 的算法,利用栈来实现算术表达式求值的算法。对算法中调 用的几个函数要给出其实现过程: (1) 函数 In(c):判断 c 是否为运算符; (2) 函数 Precede(t1,t2):判断运算符 t1 和 t2 的...
该程序很好实现了算术表达式求值,支持+、-、*、/,以=结束,符合正常表达式。
基于栈的算术表达式 在计算机科学中,基于栈的算术表达式求解是常见的编程题。这是因为栈数据结构可以帮助我们实现后缀表达式(逆波兰表示法)的解析和计算。 以下是一个简单的Python代码示例,用于解析和计算后缀...
利用栈进行算术表达式的运算。以#结束表达式的输入。包括加减乘除括号等字符。
基于栈的算术表达式求值算法.rar
1.3 编程基础之算术表达式与顺序执行 python版.rar
数据结构课程里的题目,利用栈进行算术表达式运算的算法原理
算术表达式的求解-数据结构课程设计报告.pdf
2、采用栈结构进行算术表达式的求解过程(不用栈结构验收不合格); 3、能够判断算术表达式正确与否; 4、对于错误表达式给出提示; 5、对于正确的表达式给出最后的结果; 设计要求: (1) 符合课题要求,实现相应...
对于基本的算术表达式,以字符序列的形式从终端进行输入,要求语法正确的,不含变量,按照算术运算优先级顺序,实现基本算术表达式的运算过程。 (1) 输入:输入一个算术表达式,以#结束 (2) 输出:输出数据栈...
用栈实现算术表达式的计算,运算符包括+、-、*、/、(、)、=、小数点,类似于编译原理,用来日常计算非常方便。
问题描述:在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入...
使用Lex, Yacc开发的算术表达式解析器,以及算术表达式的计算器。压缩文件包括代码,工程文件,文档。
对算法中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符; (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级; (3) 函数Operate(a,theta,b):对a和b进行二元运算theta。
这个是用堆栈的方式来实现算术表达式,有良好的用户界面