![31ddc5809a74be87e67530b0f0911e3b.png](https://i-blog.csdnimg.cn/blog_migrate/48bb2fff0005ca1a196744055c5a794c.jpeg)
相关C++知识点有类和基础的概念和成员函数,派生类函数的引用的初始化,难点在于析构函数的过程理解,STACK声明体内析构函数做过注释的部分。测试库仍依赖马光志老师手搓,需要函数库的小伙伴私信。
关于栈和队列数据结构的讲解:
吃星星的小芒果:用栈算法递归解决汉诺塔问题zhuanlan.zhihu.com![16a3c7d58a78fd7f178dd65dc3283bc8.png](https://i-blog.csdnimg.cn/blog_migrate/cde741c710ef44a39075c67daa4d77e9.jpeg)
1. 需求分析:
整型栈是一种先进先出的存储结构,对其进行的操作通常包括:向栈顶压入一个整型元素、从栈顶弹出一个整型元素等。整型栈类STACK采用之前定义的两个QUEUE类模拟一个栈,其操作函数采用面向对象的C++语言定义,请将完成上述操作的所有如下函数采用C++语言编程, 然后写一个main函数对栈的所有操作函数进行测试,请不要自己添加定义任何新的函数成员和数据成员。
class
编程时应采用VS2019开发,并将其编译模式设置为X86模式,其他需要注意的事项说明如下:
(1)在用STACK(int m)对栈初始化时, 为其基类和成员q的elems分配m个整型元素内存,并初始化基类和成员q的max为m,以及初始化对应的head=tail=0。
(2)对于STACK(const STACK& s)深拷贝构造函数,在用已经存在的对象s深拷贝构造新对象时,新对象不能共用s的基类和成员q为elems分配的内存,新对象要为其基类和成员q的elems分配和s为其基类和成员q的elems分配的同样大小的内存,并且将s相应的elems的内容深拷贝至新对象为对应elems分配的内存;新对象应设置其基类和成员q的max、head、tail和s的对应值相同。
(3)对于STACK(STACK&& s)noexcept移动拷贝构造函数,在用已经存在的对象s移动构造新对象时,新对象接受使用s为其基类和成员q的对应elems分配的内存,并且新对象的max、head、tail应和s的基类和成员q的对应值相同;s的基类和成员q的elems设置为空指针以表示内存被移走,同时其对应的max、head、tail均应置为0。
(4)对于STACK& operator=(const STACK& s)深拷贝赋值函数,在用等号右边的对象s深拷贝赋值等号左边的对象s时,等号左边对象的基类和成员q不能共用s的基类和成员q为elems分配的内存,若等号左边的对象为其基类和成员q的elems分配了内存,则应先释放掉以避免内存泄漏,然后为其elems分配和s为其基类和成员q的elems分配的同样大小的内存,并且将s对应两个elems的内容拷贝至等号左边对象对应两个elems的内存;等号左边对象中的max、head、tail应设置成和s中基类和成员q的对应值相同。
(5)对于STACK& operator=(STACK&& s)noexcept移动赋值,在用等号右边的对象s移动赋值给等号左边的对象时,等号左边的对象如果已经为其基类和成员q中的elems分配了内存,则应先释放以避免内存泄漏,然后接受使用s的基类和成员q为elems分配的内存,并且等号左边对象中的max、head、tail应和s中基类和成员q中的对应值相同;s中基类和成员q的elems设置为空指针以表示内存被移走,同时其对应的max、head、tail均应设置为0。
(6)打印栈时从栈底打印到栈顶。
//