题目描述
- 经过第四次作业,相信大家都对面向对象的分析与设计有了萌芽式的了解。那么本次作业的第一点就是针对第四次作业的完善。请根据第四次作业分析设计的结果进行编码。要求根据设计的类图进行编码,写出实现该程序所需要的类。
- 学习数据结构栈的知识。
代码的实现
在第三次作业中,我已经实现了对各个类的分离,不过在算法上还是暴力求解。这次我学习了栈的运用,把负责计算结果的函数calculateResult进行了改进,改为用栈运算。
GitHub链接
讲一下我对栈的理解
- 首先栈是后进先出的线性表,允许插入和删除的一端叫栈顶(Top),不允许操作的一端叫栈底(Bottom),插入运算叫进栈(Push),删除运算叫出栈(Pop),无元素的栈叫空栈(Empty Stack)
- 有头文件#include
可以实现对栈的调用:
stack<Type(如int)>a; //定义一个a栈
a.empty(); //判空运算,空则返回真
a.push(Type x); //在栈顶插入元素
a.pop(); //在栈顶删除元素
a.top(); //返回栈顶元素
a.size(); //返回栈中元素数目
-四则运算用栈的方式更方便,因为逆波兰表达式本来就是用栈的思想实现的。
- 逆波兰表达式又叫做后缀表达式,即对于表达式Exp=ab+(c-d/e)f,其中S1=ab,S2=(c-d/e)f,S1的后缀表达式是ab,S2的后缀表达式是(c-d/e)f,(c-d/e)又可以变成cd/e-,d/e又有de/,所以Exp=abcde/-f+
- 以下是简单的逆波兰的栈运算步骤:
不好意思,括号忘了解释了,补上:在栈的运用过程中,需要对各个运算符做优先级的比较。这个实现需要两个栈,分别是存操作数(简称num)和运算符(简称opo)的。那上面图中的例子来说,可以先在栈底push一个‘#’,然后从左到右扫描,
- ‘a’ push到num,检索指针后移
- ‘*’ 优先级高于 #,push到opo,检索指针后移
- ‘(’ 优先级高于 *,push到opo,检索指针后移
- ‘b’ push到num,检索指针后移
- ‘+’ 优先级高于(,push到opo,检索指针后移
- ‘c’ push到num,检索指针后移
- ‘)’优先级小于 +,检索指针不动, b,c出栈,相加后T1压回num,+ 出栈
- ‘)’优先级等于( 且括号配对,检索指针后移, ( 出栈
- ‘#’优先级小于 * ,T1和a出栈,相乘后压回num, * 出栈,检索指针不动
- ‘#’ 等于 #,程序结束