C++封装栈
2016-07-04 19:40
218 查看
动手前的考虑
对于栈而言,其实其本质仍然为线性结构,并没有产生本质的变化,因此其内部存储结构仍然可以选用之前两篇文章的存储结构进行存储。对于结构的考虑
对于线性结构而言,其实是存在两种形式的,分别是:连续的向量式、不连续的链式结构。而这两者结构,都有不同的优缺点,其中需要了解的是:
向量式的更加适合于增删操作不频繁,而需要频繁随机访问元素的情形
链式的则更加适合于增删操作频繁的情况,而对于链式结构的访问来说,需要对链结构进行遍历,将会产生0(n)的复杂度。
基于以上的分析,我们基本可以得出一个结论,对于栈而言,其需要频繁的是入栈和出栈,这其实便是元素的增加和删除。而栈不存在根据下标位置的访问,因此采用链式结构,是最为合适的!
开始你的实现
栈继承自:链式表// // ZStack.hpp // Array // // Created by 邹智鹏 on 16/7/4. // Copyright © 2016年 Frank. All rights reserved. // #ifndef ZStack_hpp #define ZStack_hpp #include <stdio.h> #include "ZLinkedList.hpp" namespace ZTemplate { template<class T> class ZStack : protected ZLinkedList<T> { public: ZStack<T>(); /** * 压栈 */ void push(T val); /** * 出栈 */ T popup(); /** * 虚析构 */ virtual ~ZStack(){} /** * 是否空栈 */ bool empty() const; /** * 获取栈中元素个数 * @return 返回个数 */ z_size count() const; }; template<class T> ZStack<T>::ZStack() : ZLinkedList<T>(){ } template<class T> void ZStack<T>::push(T val) { this->push_back(val); } template<class T> T ZStack<T>::popup() { return this->pop(this->_length - 1); } template<class T> bool ZStack<T>::empty() const { return this->isEmpty(); } template<class T> z_size ZStack<T>::count() const { return this->_length; } } #endif /* ZStack_hpp */
以上则为栈的实现,在这个实现中,采用protected方式继承,保证Sequence接口中,没有过多的接口被暴露,而只提供入栈和出栈的接口,并且可以判断栈是否为空!
以上即为栈的简单实现!
涉及之前的类,请移步至:C++封装线性表-向量、C++封装链式表-链表
本博客设计完整代码以托管至Github,如果有问题欢迎issue,如果有帮助欢迎star!
Github地址:Array数据结构封装
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C++基于栈实现铁轨问题
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构