【概述】
顺序栈是采取顺序方式存储的栈,利用一组地址连续的存储单元自栈底到栈顶存放数据元素,并通过栈指针来指示当前栈顶元素位置
对于存储空间的分配,若采用静态分配方式,一经分配不可修改,若采用动态分配方式,分配后在 $O(n)$ 的时间复杂度内可以更改
顺序栈的实现类如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | #define N 50 + 5  template <typename T>  class SeqStack {   public:     SeqStack();                int getLen();              bool empty();              bool full();               bool pop(T &elem);         bool push(T elem);         bool getTop(T &elem);      void print();            private:     T data[N];                 int top;               };
   | 
 
【初始化】
初始化时,栈为空栈,栈中无元素,此时栈指针 top 一般设为 -1,有时也可令 top=0,以表明 top 指向栈顶元素的下一存储单元
1 2 3 4
   | template <typename T>  SeqStack<T>::SeqStack() {      top = -1; }
   | 
 
【求栈长】
由于栈指针指示了栈顶元素位置,因此栈的长度即为栈指针的大小,需要注意的是,当栈指针初始化为 -1 时,最终的栈长要 +1
1 2 3 4
   | template <typename T>  int SeqStack<T>::getLen() {      return top + 1; }
   | 
 
【判空】
判空时,只需判断栈指针 top 是否为初始值即可
1 2 3 4 5 6
   | template <typename T>  bool SeqStack<T>::empty() {      if (top == -1)         return true;     return false; }
   | 
 
【判满】
判满时,只需要判断栈指针 top 是否达到最大栈空间即可
1 2 3 4 5 6
   | template <typename T>  bool SeqStack<T>::full() {      if (top == N - 1)         return true;     return false; }
   | 
 
【出栈】
在出栈时,要进行下溢判断,即在栈已空的情况下,再进行出栈操作,会发生溢出
1 2 3 4 5 6 7
   | template <typename T>  bool SeqStack<T>::pop(T &elem) {      if (empty())                          return false;     elem = data[top--];     return true; }
   | 
 
【入栈】
由于顺序栈的存储空间有限,因此在入栈时,要进行上溢判断,即在栈已满的情况下,再进行入栈操作时,会发生溢出
1 2 3 4 5 6 7
   | template <typename T>  bool SeqStack<T>::push(T elem) {      if (full())                           return false;     data[++top] = elem;     return true; }
   | 
 
【取栈顶】
在取栈顶时,要进行下溢判断,以确保不会在栈已空的情况下取到元素
1 2 3 4 5 6 7
   | template <typename T>  bool SeqStack<T>::getTop(T &elem) {      if (empty())                             return false;     elem = data[top];     return true; }
   | 
 
【输出】
在输出时,从栈顶开始,将栈中所有元素依次出栈,进行输出即可
1 2 3 4 5 6 7 8 9
   | template <typename T>  void SeqStack<T>::print() {      int elem;     while (!empty()) {          pop(elem);         cout << elem << " ";     }     cout << endl; }
   |