动手前的考虑
对于栈而言,其实其本质仍然为线性结构,并没有产生本质的变化,因此其内部存储结构仍然可以选用之前两篇文章的存储结构进行存储。
对于结构的考虑
对于线性结构而言,其实是存在两种形式的,分别是:连续的向量式、不连续的链式结构。
而这两者结构,都有不同的优缺点,其中需要了解的是:
- 向量式的更加适合于增删操作不频繁,而需要频繁随机访问元素的情形
- 链式的则更加适合于增删操作频繁的情况,而对于链式结构的访问来说,需要对链结构进行遍历,将会产生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数据结构封装