• 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, * 出栈,检索指针不动
    • ‘#’ 等于 #,程序结束

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

  • 相关阅读:
    [LeetCode]Binary Tree Inorder Traversal
    [LeetCode]Binary Tree Preorder Traversal
    [LeetCode]Number of 1 Bits
    [LeetCode]Best Time to Buy and Sell Stock IV
    第四章 线程
    第三章 进程描述和控制
    第二章 操作系统概述
    第一章 计算机系统概述
    Qt创建对话框的三种方法
    strdup函数
  • 原文地址:https://www.cnblogs.com/s0316026/p/6891962.html
Copyright © 2020-2023  润新知