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 的遍历.