【Algo】栈 Stack

Backto Algo Index

简介 Intro

首先要区分数据结构的栈 和 操作系统的栈.
这里的栈指的是 FILO 的数据结构.

实现 Implementation

基于数组的栈

  • arraystack.h
/**
 * 1) 顺序栈的操作:push 和 pop
 * 2) 采用模板的方法实现任意类型数据的存储
 * 3) 支持动态扩容。初始大小为 10, 每次扩容 1.5 倍
 */
template<class T>
class ArrayStack {
 public:
  ArrayStack();
  ArrayStack(int n);
  ~ArrayStack();
  void Push(T data);
  T Pop();
  T Peek();// 偷瞄一眼,只返回栈顶元素,但不删除, 栈顶指针不变
  int size() const;
  int capacity() const;
 private:
  int size;
  int capacity;
  T* array;
};
  • arraystack.cpp
#include "arraystack.h"

//无参数, 初始化大小为 10
template<class T>
ArrayStack<T>::ArrayStack() {
  this->capacity = 10;
  this->array = new T[this->capacity];
  this->size = 0;
}
// 带参数,初始化为指定大小
template<class T>
ArrayStack<T>::ArrayStack(int n) {
  if(n <= 0)
  	return;
  this->capacity = n;
  this->array = new T[this->capacity];
  this->size = 0;
}
// 销毁栈
template<class T>
ArrayStack<T>::~ArrayStack() {
    SafeDeleteArray(this->array);
    this->size = 0;
    this->capacity = 0;
}
// push
template<class T>
void ArrayStack<T>::Push(T data) {
  if(size == capacity) { // stack is full
    capacity = static_cast<int>(capacity*1.5);
    T* tmp = new T[capacity];
    for(int i= 0; i < size; ++i)
    	tmp[i] = array[i];
    delete[] array;
    array = tmp;
    array[size++] = data;
  }
}
//Pop
template<class T>
T ArrayStack<T>::Pop() {
  if(size >= 1) {
      return array[--size]; // minus 1 firstly to pick the right elem
  } else {
      ThrowError("Can't Pop From Empty Stack!!!");
  }
}

//Peek
template<class T>
T ArrayStack<T>::Peek(){
    if(size >= 1) {
      return array[size-1]; // index minus 1, do NOT change value of size
  } else {
      ThrowError("Can't Peek From Empty Stack!!!");
  }
}
template<class T>
int ArrayStack<T>::size() {
  return size;
}
template<class T>
int ArrayStack<T>::capacity() {
  return capacity;
}
  • test main.cpp
#include "arraystack.h"
#include <iostream>
int main(int argc, char** argv) {
  ArrayStack<int> numStack(16);
  //Bussiness goes here
  return 0;
}
  • 注: 代码来自 caozx, 略作修改

应用 Scenarios

栈的应用很广泛, 一般可分为 单栈双栈 两种情形.

Case 01: 单栈代替 recursion

利用栈实现 BinaryTree 的 Pre-order, In-order, Post-Order 的遍历.

Case 02: 双栈实现算数计算

Case 03: 双栈实现浏览器的前进-后退 Forward-Back

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值