栈的定义
- 栈是一种特殊的线性表
栈仅能在线性表的一端进行操作
- 栈顶(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;
};
栈的顺序实现
StaticStack 设计要点
类模板
- 使用原生数组作为栈的存储空间
- 使用模板参数决定栈的最大容量
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.h
#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.cpp
#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 的最大容量由模板参数决定
以上内容整理于狄泰软件学院系列课程,请大家保护原创!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。