又开始看栈了。虽然是最简单的数据结构之一,依然记得大一下学期的时候为了想用C++写一个栈的类。。碰到各种诡异的语法错误之后信心全无,最后放弃了。从此对C++没什么好感,为什么会有这么多复杂的特性和麻烦的语法。所以本来是打算用Python实现一个的,不过写着写着发现人家的List已经完全实现栈的功能了,写个蛋啊。。
遂又决定把C++拣回来,大一买的C++ Primer已经好久没看了,下午又拿出来翻了好久,倒腾半天写出一个模板类,蛋疼的语法依旧蛋疼,不过还好咱的耐心也不是当年了。=。=
不说了,人越老越喜欢吐槽。。什么情况。
栈是一种动态集合,遵循——LAST IN FIRST OUT(LIFO)的法则,后进先出。像我堆在桶里的臭袜子一样,先放进去的最后会被压在最底下,最后放进去的在顶上,每次只能取出最上面的一只(把手伸进底下强行拿,后果不堪设想啊=。=)。既然是动态集合,就有两种基本的操作,添加和删除,对于LIFO来说,添加操作被称为PUSH,删除操作被称为POP,都是对当前栈顶进行操作,PUSH将对象压入栈的最顶端,而POP讲原来栈顶的元素弹出。所以,实现栈的时候,一个关键的数据就是当前栈的位置,称为TOP。
另外吐槽一下,栈因为一些细节分为四类。栈地址从高到低还是从低到高,栈顶指针指向的位置是空还是满,就有了递增满栈,递减空栈等。
下面的实现是根据算法导论上的描述写的,属于满栈,至于递增还是递减忘了。。貌似IA32指令集都是递减的栈?
// A stack template #ifndef _STACK_H_ #define _STACK_H_ #include <iostream> template <class T> class Stack { private: int top; T* array; public: Stack(){top = -1;} Stack(int size); ~Stack(); void push(T val); T pop(); bool isEmpty(); }; template <class T> Stack<T>::Stack(int size) { top = -1; array = new T[size]; } template <class T> // 2012/01/10 添加析构函数 Stack<T>::~Stack() { delete [] array; } template <class T> bool Stack<T>::isEmpty() { return top == -1; } template <class T> void Stack<T>::push(T val) { array[++top] = val; } template <class T> T Stack<T>::pop() { if(isEmpty()) { std::cout << "Stack is empty!" << std::endl; exit(EXIT_FAILURE); } else { return array[top--]; } } #endif
这栈写得非常简单,栈顶是否溢出都没检查。。不知道以后能用的上不,有需要再改吧