上大数据结构课件第4章 栈和队列

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

出栈
template<class ElemType> Status SqStack<ElemType>::Pop(ElemType &e) { if (Empty()) // 栈空 return UNDER_FLOW; else { // 操作成功 e = elems[--top]; return SUCCESS; } }
栈顶
ຫໍສະໝຸດ Baidu
(b) 向链栈中插入两个结点D和E
data next D 栈顶
data next C
data next B
data next A
top
^
栈底
(c) 从链栈中删除栈顶结点E
图4.4 栈的链接存储结构及其操作过程
链式栈的类定义
#include "node.h" // 链栈类 template<class ElemType> class LinkStack { protected: // 链栈的数据成员: Node<ElemType> *top; // 结点类
取栈顶元素
template<class ElemType> Status LinkStack<ElemType>::Top(ElemType &e) const { if(Empty()) // 栈空 return UNDER_FLOW; else { // 栈非空,操作成功 e = top->data;// 用e返回栈顶元素 return SUCCESS; } }
遍历顺序栈
template <class ElemType> void SqStack<ElemType>::Traverse(void (*Visit)(const ElemType &)) const { for (int Pos = top-1; Pos >= 0; Pos--) (*Visit)(elems[Pos]); }
(Last In First Out,LIFO)的线性表。
出栈 栈顶
进栈 出栈 an

a2 栈底 a1 (a) 栈的示意图
(b ) 铁路调序栈
图4.1 栈的结构示意图
【例4.1】 很窄的死胡同,每次只能容许一人进出.
死胡同 ⑩⑨⑧⑦⑥⑤④③②①
图4.2 死胡同示意图 【例4.2】 桌上的一摞书,假定每次取书只取最上面的一 本,放书必须放在最上面。
void Clear();
void Traverse(void (*Visit)(const ElemType &)) const; Status Push(const ElemType &e);
Status Top(ElemType &e) const;
Status Pop(ElemType &e);
入栈
template<class ElemType> Status LinkStack<ElemType>::Push(const ElemType &e) { Node<ElemType> *new_top = new Node<ElemType>(e, top); if (new_top == NULL) // 动态内存耗尽 return OVER_FLOW; else { // 操作成功 top = new_top; return SUCCESS; } }
【例4.5】 假设一个栈S为(A,B,C),采用链栈存储。
data next C data next B data next A 栈底
^
top
栈顶
(a) 栈的链接存储结构
data next E data next D data next C data next B data next A 栈底
^
top
栈的基本操作
初始化:初始化一个空栈。
求长度:求栈中数据元素的数目。
取栈顶元素:当栈不空时,取栈顶数据元素,并返回成功状
态;否则返回不成功状态。 入栈:在栈顶插入一个新元素item。如果能顺利插入元素, 则返回插入成功;否则返回插入失败。
出栈:当栈不空时,删除栈顶元素,并返回出栈成功;否则
{
判断链式栈是否为空
template<class ElemType> bool SqStack<ElemType>::Empty() const { return top = = NULL; }
清空链式栈
template<class ElemType> void SqStack<ElemType>::Clear() { Node<ElemType> *Ptr; while (top != NULL) { Ptr = top; top = top->next; delete Ptr; } }
顺序栈的定义
// 顺序栈类
template<class ElemType> class SqStack
{
protected: // 顺序栈的数据成员:
int top;
int maxSize;
// 栈顶指针
// 栈最大容量
ElemType *elems;// 元素存储空间
public:
SqStack(int size = DEFAULT_SIZE); virtual ~SqStack(); int Length() const; bool Empty() const;
顺序栈的析构函数
template<class ElemType> SqStack<ElemType>::~SqStack() { delete []elems; }
// 释放存储空间
求顺序栈的长度
template <class ElemType> int SqStack<ElemType>::Length() const { return top; }
遍历链式栈
template <class ElemType> void LinkStack<ElemType>::Traverse(void (*Visit)(const ElemType &)) const { Node<ElemType> *Ptr; for (Ptr = top; Ptr != NULL; Ptr = Ptr->next) (*Visit)(Ptr->data); }
图4.3 栈的顺序存储结构及其操作过程
顺序栈的构造函数
template<class ElemType> SqStack<ElemType>::SqStack(int size) { maxSize = size; // 最大元素个数 if (elems != NULL) delete []elems; // 释放已有存储空间 elems = new ElemType[maxSize]; // 分配新的存储空间 top = 0; }
返回出栈失败。 判断栈是否为空栈:如果栈为空,则返回值TRUE,否则返 回值FALSE。 清空栈:将栈为空栈。
4.2 栈的存储结构
4.2.1 栈的顺序存储结构 4.2.2 栈的链接存储结构 4.2.3 栈的两种存储结构的比较 4.2.4 多个栈共享一个数组的存储空间
4.2.1 栈的顺序存储结构
入栈
template<class ElemType> Status SqStack<ElemType>::Push(const ElemType &e) { if (top == maxSize) // 栈已满 return OVER_FLOW; else { // 操作成功 elems[top++] = e; return SUCCESS; } }
// 栈顶指针
public: // 链栈的函数成员: LinkStack(); virtual ~LinkStack(); int Length() const; // 求栈长度 bool Empty() const; // 判断栈是否为空 void Clear(); // 将栈清空 void Traverse(void (*Visit)(const ElemType &)) const ; Status Push(const ElemType &e); // 入栈 Status Top(ElemType &e) const; // 取栈顶元素 Status Pop(ElemType &e); // 出栈 };
};
【例】 假设顺序栈为(A,B,C,D,E,F),栈中最多能存储6个元 素。请给出入栈和出栈时,其栈顶指针top和栈的变化情况。
top F E D C top top A B A top E D C B A top C B A
(a)空栈
(b)A入栈
(c)BCDEF入栈 (d)F出栈
(e)ED出栈
出栈
template<class ElemType> Status LinkStack<ElemType>::Pop(ElemType &e) { if (Empty()) // 栈空 return UNDER_FLOW; else { // 操作成功 Node<ElemType> *old_top = top;// 旧栈顶 e = old_top->data; // 用e返回栈顶元素 top = old_top->next; // top指向新栈顶 delete old_top; // 删除旧栈顶 return SUCCESS; } }
判断顺序栈是否为空
template<class ElemType> bool SqStack<ElemType>::Empty() const { return top = = 0; }
清空顺序栈
template<class ElemType> void SqStack<ElemType>::Clear() { top = 0; }
链序栈的构造函数
template<class ElemType> LinkStack<ElemType>::LinkStack() { top = NULL; }
链序栈的析构函数
template<class ElemType> LinkStack<ElemType>::~LinkStack() { Clear(); }
取栈顶元素
template<class ElemType> Status SqStack<ElemType>::Top(ElemType &e) const { if(Empty()) // 栈空 return UNDER_FLOW; else { // 栈非空,操作成功 e = elems[top - 1]; // 用e返回栈顶元素 return SUCCESS; } }
第4章 栈 和 队 列
上海大学计算机学院 沈 俊
JShen@staff.shu.edu.cn
主要内容
4.1 4.2 4.3 4.4 4.5 4.6 4.7 栈的基本概念 栈的存储结构 栈的基本运算 栈的简单应用举例 队列的基本概念 队列的存储结构 队列的基本运算
4.1 栈的基本概念
栈(stack)是限定仅在表尾一端进行插入或删除操作的特 殊线性表。对于栈来说, 允许进行插入或删除操作的一端称为栈 顶(top),而另一端称为栈底(bottom)。不含元素栈称为空栈, 向栈中插入一个新元素称为入栈或压栈, 从栈中删除一个元素 称为出栈或退栈。 假设有一个栈S=(a1, a2, …, an), a1先进栈, an最后进栈。称 a1为栈底元素, an为栈顶元素, 如图3.1所示。出栈时只允许在栈 顶进行, 所以an 先出栈, a1 最后出栈。因此又称栈为后进先出
4.2.2 栈的链接存储结构
•top是栈顶指针,指向链栈的栈顶结点; •top=NULL 表示栈空; •若链栈非空,则top是指向链表的第一个结点(栈顶结点)的指针。 •栈顶结点是最后一个入栈的元素,而栈底结点是最先入栈的元素。
•链栈的结点是动态分配的,不会出现栈满的现象,只有空栈和非空栈两种状
态。
求链式栈的长度
template <class ElemType> int LinkStack<ElemType>::Length() const { int count = 0; // 计数器 Node<ElemType> *Ptr; for (Ptr = top; Ptr != NULL; Ptr = Ptr->next) count++; } return count; }
相关文档
最新文档