顺序栈
template<typename T,int Size=10>class Stack{public: Stack(); ~Stack(); void push(const T &); void pop(); T & top(); bool empty(); bool full();private: T _arr[Size]; int _top;};
template<typename T,int Size>Stack<T,Size>::Stack():_top(-1),_arr(new T[Size]){}template<typename T,int Size>Stack<T,Size>::~Stack(){ delete [] _arr;}template<typename T,int Size>void Stack<T,Size>::push(const T & elem){ if(full()) { cout << "full stack" << endl; return; } _arr[++_top] = elem;}template<typename T,int Size>void Stack<T,Size>::pop(){ if(empty()) { cout << "empty stack" << endl; return; } --_top;}template<typename T,int Size>T & Stack<T,Size>::top(){ return _arr[_top];}template<typename T,int Size>bool Stack<T,Size>::empty(){ return _top == -1;}template<typename T,int Size>bool Stack<T,Size>::full(){ return _top == Size-1;}
链栈
template<typename T>typedef struct StackNode{ T data; struct StackNode * next;}StackNode, *LinkStackPtr;template<typename T>class Stack{public: Stack(); void push(const T &); void pop(); T & top(); bool empty();private: LinkStackPtr _top; int _length;};
template<typename T>Stack<T>::Stack():_length(0),:_top(NULL){}template<typename T>void Stack<T>::push(const T & data){ LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode)); q->data= data; q->next = _top; _top = q; ++_length;}template<typename T>void Stack<T>::pop(){ if(empty()) { cout << "empty stack" << endl; return; } LinkStackPtr p = _top; _top = p->next; free(_top); --_length;}template<typename T>T & Stack<T>::top(){ return _top->data;}template<typename T>bool Stack<T>::empty(){ return _length == 0;}
两栈共享空间
栈的应用:括号匹配,表达式求值,递归,进制转换,迷宫求解