姓名:刘方姣 学号:22021211931 电子工程学院
双栈实现计算器-基于C语言
0.实现思路
先看一个算式的计算过程,例如式子2*(2+2^2-1),这个式子的计算过程当然的先计算'^'的左右操作数,然后再计算'+'左右操作数,再‘-’,最后计算‘*’。根据这个流程,我们可以将算式中的数字依次压入数据栈,将运算符压入运算符栈。
在运算符压栈过程中,需要保持栈顶运算符为当前栈内优先级最高的,换言之就是比当前栈内运算符优先级高的运算符已经完成了运算操作。
运算操作指的就是根据弹栈得到的运算符,将数字栈进行两次出栈操作的到源数和目的数,根据这三个量进行相应的运算后将结果再压入栈内。
显然,由于括号的存在,括号内运算符的优先级要有顺序并且整体大于括号外运算符的优先级。因此,我在‘(’时将接下来遇到的所有运算符的优先级进行提升,遇见‘)’时将所有运算符优先级恢复,并在检测时对栈顶优先级和当前运算符进行优先级更新。
1.1构建一个栈
c语言并没有一个类或者一个库包含栈这个数据结构,所以得先从构造一个栈开始。幸好之前我闲的没事把队列和栈都已经写好了,虽然有很多弊端,但也够这次实验使用。
首先,定义一个stack结构体
1.2计算器本体
可以看到测试的算式运算结构都没问题。
3.存在的问题
目前存在的问题有
输入字符之间不能有空格,原因是我没有对空格进行过滤,加个空格过滤就ok了
只能进行十以内数字的混合运算,原因是输入使用的是ASCII码,在压入数据栈的时对数据进行加权求和就ok了
输入等式长度受限,这是代码内栈长度宏定义导致的。