11 阅读2分钟

顺序栈

使用数组实现

代码

#include <iostream>
#include <string.h>
using namespace std;



class SeqStack {
  public:
    SeqStack(int size=10)
             : mTop(0)
             , mCap(size)
    {
      mpStack = new int[size];
    }

    ~SeqStack()
    {
      delete[] mpStack;
      mpStack = nullptr;
    }

  public:
    // 入栈
    void push(int val) {
      if (mTop == mCap) {
        // 栈满了,需要进行扩容操作
        expand(2 * mCap);
      }

      // 开始入栈
      mpStack[mTop] = val;
      mTop++;
    }

    // 出栈
    void pop() {
      if (mTop == 0) {
        // 栈为空
        throw "stack is empty";
      }

      mTop--;
    }

    // 获取栈顶元素
    int top() const {
      if (mTop == 0) {
        // 栈为空
        throw "Stack is empty";
      }

      return mpStack[mTop - 1];
    }

    // 判断栈是否为空
    bool empty() const {
      return mTop == 0;
    }

    // 栈中元素的个数
    int size() const {
      return mTop;
    }

  private:
    void expand(int size) {
      int* p = new int[size];
      memcpy(p, mpStack, mTop * sizeof(int));  // memcpy是按字节拷贝的,因此需要mTop * sizeof(int)
      delete[] mpStack;
      mpStack = p;
      mCap = size;
    }

  private:
    int* mpStack;
    int mTop;   // 栈顶位置
    int mCap;   // 栈空间大小

};

测试

代码

int main() {
  int arr[] = {12, 45, 78,98, 34, 45};
  SeqStack s;

  for (int v : arr) {
    s.push(v);
  }

  while (!s.empty())
  {
    cout << s.top() << " ";
    s.pop();
  }

  cout << endl;
  
  return 0;

}

测试结果

➜  build git:(main) ✗ ./SeqStack     
45 34 98 78 45 12 

链式栈

我们使用链表的头插和头删来创建链式栈

代码

#include <iostream>
#include <string.h>
using namespace std;


class LinkStack {
  public:
    LinkStack(): size_(0) {
      head_ = new Node();
    }

    ~LinkStack() {
      Node *p = head_;

      while (p != nullptr)  
      {
        head_ = head_->next_;
        delete p;
        p = head_;
      }
      
    }

  public:
    // 入栈操作
    void push(int val) {
      Node* node = new Node(val);
      node->next_ = head_->next_;
      head_->next_ = node;
      size_++;
    }

    // 出栈

    void pop() {
      if (head_->next_ == nullptr) {
        // 栈为空
        throw "stack is empty";
      }

      Node* p = head_->next_;
      head_->next_ = p->next_;
      delete p;
      size_--;

    }

    // 获取栈顶元素
    int top() const{
      if (head_->next_ == nullptr) {
        // 栈为空
        throw "stack is empty";
      }

      return head_->next_->data_;
    }

    // 判空
    bool empty() const{
      return head_->next_ == nullptr;
    }

    // 返回栈元素个数
    int size() const {
      return size_;
    }


  private:
    struct Node {
      Node(int data = 0): data_(data), next_(nullptr) {};
      int data_;
      Node* next_;
    };

    Node* head_;
    int size_;  // 记录元素个数
};

测试

代码


int main() {
  int arr[] = {12, 45, 78,98, 34, 45};
  LinkStack s;

  for (int v : arr) {
    s.push(v);
  }

  while (!s.empty())
  {
    cout << s.top() << " ";
    s.pop();
  }

  cout << endl;
  
  return 0;

}

测试结果

➜  build git:(main) ✗ ./LinkStack    
45 34 98 78 45 12