- 栈是一种特殊的线性表
栈仅能在线性表的一端进行操做ios
- 栈顶(Top):容许操做的一端
- 栈底(Bottom):不容许操做的一端
- 后进先出 (Last In first Out)
- 建立栈 (Stack())
- 销毁栈 (~Stack())
- 清空栈 (clear())
- 进栈 (push())
- 出栈 (pop())
- 获取栈顶元素 (top())
- 获取栈大小 (size())
template <typename T> class Stack : Object { public: virtual void push(const T &e) = 0; virtual void pop() = 0; virtual T top() const = 0; virtual void clear() = 0; virtual int size() const = 0; };
类模板编程
- 使用原生数组做为栈的存储空间
- 使用模板参数决定栈的最大容量
template <typename T, int N> class StaticStack : public Stack<T> { public: StaticStack(); // 初始化成员变量 int capacity() const; protected: T m_space[N]; // 栈存储空间,N为模板参数 int m_top; // 栈顶标识 int m_size; // 当前栈的大小 };
文件:Stack.h数组
#ifndef STACK_H #define STACK_H #include "Object.h" namespace DTLib { template <typename T> class Stack : public Object { public: virtual void push(const T &e) = 0; virtual void pop() = 0; virtual T top() const = 0; virtual void clear() = 0; virtual int size() const = 0; }; } #endif // STACK_H
文件:StaticStack.hide
#ifndef STAITCSTACK_H #define STAITCSTACK_H #include "Stack.h" #include "Exception.h" namespace DTLib { template <typename T, int N> class StaticStack : public Stack<T> { public: StaticStack() = default; int capacity() const // O(1) { return N; } void push(const T &e) override // O(1) { if (m_size < N) { m_space[m_top + 1] = e; ++m_top; ++m_size; } else { THROW_EXCEPTION(InvalidOpertionExcetion, "No enough space to push StaticStack ..."); } } void pop() override // O(1) { if (m_size > 0) { --m_top; --m_size; } else { THROW_EXCEPTION(InvalidOpertionExcetion, "No element to pop StaticStack ..."); } } T top() const override // O(1) { if (m_size > 0) { return m_space[m_top]; } else { THROW_EXCEPTION(InvalidOpertionExcetion, "No element in current StaticStack ..."); } } void clear() override // O(1) { m_top = -1; m_size = 0; } int size() const override // O(1) { return m_size; } ~StaticStack() // O(1) { clear(); } protected: T m_space[N]; int m_top = -1; int m_size = 0; }; } #endif // STAITCSTACK_H
文件:main.cppspa
#include <iostream> #include "StaitcStack.h" using namespace std; using namespace DTLib; int main() { StaticStack<int, 5> stack; for (int i=0; i<5; ++i) { stack.push(i); } while (stack.size() > 0) { cout << stack.top() << endl; stack.pop(); } return 0; }
输出:设计
4 3 2 1 0
- 栈是一种特殊的线性表
- 栈只容许在线性表的一端进行操做
- StaticStack 使用原生数组做为内存存储空间
- StaticStack 的最大容量由模板参数决定
以上内容整理于狄泰软件学院系列课程,请你们保护原创!3d