文章目录
- 一、定义
- 二、ADT
- 三、栈的描述方法
-
- 3.1 数组描述
-
- 3.1.1 派生arrayList
- 3.1.2 定制数组arrayStack
- 3.2 链表描述
-
- 3.2.1 派生chain
- 3.2.2 定制数组LinkedStack
- 四、应用
-
- 4.1 括号匹配
- 4.2 汉诺塔
- 4.3 列车车厢重排
- 4.4 迷宫老鼠
一、定义
DEF.
栈(stack)是一个线性表,其插入(也称为添加)和删除操作都在表的同一端进行。
- 其中允许插入和删除的一端被称为栈顶(top)
- 另一端被称为栈底(bottom)
- 栈是一个
后进先出
( LIFO (Last-In, First-Out) )表
二、ADT
ADT包含实例和操作。
- 实例
元素线性表,一端为栈底,另一端为栈顶 - 操作
empty();//栈为空返回true,否则返回false
size();//返回栈中元素个数
top();//返回栈顶元素
pop();//删除栈顶元素
push(x);//将元素x压入栈
template<class T>
class stack{
public:
virtual ~stack(){
}
// 栈为空返回true,否则false
virtual bool empty() const=0;
// 返回栈中元素个数
virtual int size() const=0;
// 返回栈顶元素
virtual T& top() =0;
// 删除栈顶元素
virtual void pop() = 0;
// 将元素theEle入栈
virtual void push(const T& theEle) =0;
}
三、栈的描述方法
栈是一种线性表,因此栈可以使用任何一种线性表的描述方法
- 数组描述
- 链表描述
3.1 数组描述
栈使用数组描述,有两种实现方法:
- 使用数组描述的线性表arrayList, 通过arrayList类的派生得到数组描述的栈类derivedArrayStack
- 定制数组描述的栈类arrayStack类
3.1.1 派生arrayList
思路:
- 确定栈顶元素的索引:arrayList< T >::size()-1
- 应用arrayList类中的方法来实现
template<class T>
class derivedArrayStack::private arrayList<T>,public stack<T>
{
public:
derivedArrayStack(int initialCapacity=10):arrayList<T>(initialCapacity){
}
bool empty() const{
return arrayList<T>::empty();}
int size() const{
return arrayList<T>::size();}
T& top(){
if(arrayList<T>::empty()) throw StackEmpty();
return get(arrayList<T>::size()-1;)
}
void pop(){
if(arrayList<T>::empty()) throw StackEmpty();
erase(arrayList<T>