又开始看栈了。虽然是最简单的数据结构之一,依然记得大一下学期的时候为了想用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
这栈写得非常简单,栈顶是否溢出都没检查。。不知道以后能用的上不,有需要再改吧![]()
浙公网安备 33010602011771号