2017《面向对象程序设计》课程作业五

题目描述

  • 经过第四次作业,相信大家都对面向对象的分析与设计有了萌芽式的了解。那么本次作业的第一点就是针对第四次作业的完善。请根据第四次作业分析设计的结果进行编码。要求根据设计的类图进行编码,写出实现该程序所需要的类。
  • 学习数据结构栈的知识。

代码的实现

在第三次作业中,我已经实现了对各个类的分离,不过在算法上还是暴力求解。这次我学习了栈的运用,把负责计算结果的函数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, * 出栈,检索指针不动
  • ‘#’ 等于 #,程序结束

补充一下栈里运算符间优先级关系

原文地址:https://www.cnblogs.com/s0316026/p/6891962.html