南京邮电大学数据结构A第3章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1 堆栈
3.1.1 堆栈抽象数据类型 3. 栈的C++模板抽象类
程序3-1 堆栈的C++类
#include <iostream.h> template <class T> class Stack { public: virtual bool IsEmpty() const=0; virtual bool IsFull() const=0; virtual bool Top(T &x) const=0; virtual bool Push(T x)=0; virtual bool Pop()=0; virtual void Clear()=0; };
3.2 队列
3.2.1 队列抽象数据类型 3. 队列的C++模板抽象类
template <class T> class Queue { public:
Queue(){};
~Queue(){}; virtual bool EnQueue(const T x)=0;
virtual bool DeQueue()=0;
出栈操作Pop() Node<T> *q = top; top = top->link; delete q;
top
an-1
an-2
an-3
…
a0
∧
图3-3 链式栈
3.2 队列
3.1.3 栈的链接表示 队列的示意图
Q=(a0,a1,…,an-1)
入队 课堂提要
第3章 堆栈和队列 3.1 堆栈 3.2 队列 3.2.1 队列抽象数据类型 3.2.2 队列的顺序表示 3.2.3 队列的链接表示 3.3 表达式的计算 3.4 递归
析构函数
SeqStack<T>::~SeqStack(int MaxSize) { delete [] s; }
1
0
a1 a0
栈s
图3-2 顺序栈
3.1 堆栈
3.1.2 栈的顺序表示 4. 在顺序存储表示下实现栈上定义的操作
(1)取栈顶元素
template<class T> bool SeqStack<T>::Top(T &x)const { if(IsEmpty()) { //空栈处理 cout<<"Empty"<<endl; return false; } x=s[top]; return true; } maxTop n-1 an-1 … … … top
virtual bool Front(T &x)=0; virtual bool IsEmpty() const=0; virtual bool IsFull() const=0; virtual void Clear()=0; };
3.2 队列
3.2.2 队列的顺序表示
1. 队列的顺序表示法
0
1
0
1
2
3
4=maxSize-1
50 60
r f (d) 元素60入队
3.2 队列
3.2.2 队列的顺序表示
2. 循环队列表示法
把数组从逻辑上看成是一个头尾相连的环。
3
4 2 0 f r 2 30
3.1 堆栈
3.1.3 栈的链接表示 2. 在链接表示下实现栈上定义的操作
入栈操作push(T x) Node<T> *q = new Node<T>; q->element = x; q->link = top; top=q;
top
an-1
an-2
an-3
…
a0
∧
图3-3 链式栈
3.1 堆栈
3.1.3 栈的链接表示 2. 在链接表示下实现栈上定义的操作
栈s
图3-2 顺序栈
3.1 堆栈
3.1.2 栈的顺序表示 2. 顺序栈类
template<class T> class SeqStack:public Stack<T> maxTop { public: SeqStack(int mSize); ~SeqStack(){delete []s;} n-1 an-1 top bool IsEmpty()const{ return (top==-1); } bool IsFull()const { return(top==MaxTop); } bool Top(T &x)const; a1 1 bool Push(T x); a0 0 bool Pop(); void Clear() {top=-1;} 栈s private: 图3-2 顺序栈 int top; //总是指向栈顶元素 int maxTop; T *s; } … … …
3.1 堆栈
3.1.2 栈的顺序表示 3. 动态一维数组描述顺序栈类
template<class T> class SeqStack:public Stack<T> { public: …… private: int maxTop; int top; T *s; } maxTop n-1 an-1 … … … top
1
0
a1 a0
栈s
图3-2 顺序栈
3.1 堆栈
3.1.2 栈的顺序表示 4. 在顺序存储表示下实现栈上定义的操作
(2)进栈(压入)
template<class T> bool SeqStack<T>::Push(T &x) { if(IsFull()) { //溢出处理 cout<<"Overflow"<<endl; return false; } s[++top]=x; return true; } maxTop n-1 an-1 … … … top
3.2 队列
3.2.1 队列抽象数据类型 1. 队列的定义
若给定队列 Q=(a0,a1,…,an-1) ,则称 a0 是队头元素, an-1 是队
尾元素。元素a0,…,an-1依次入队,出队的顺序与入队相同,
a0出队后,a1才能出队,因此又称队列为先进先出(First In First Out——FIFO)的动态线性数据结构。 入队
ADT Queue { 数据: 0个或多个元素的线性序列(a0,a1,…,an-1),其最大长度为 MaxQueueSize。 它插入在一端进行,而删除在另一端进行,并遵循FIFO原则。 运算: Create(): 建立一个空队列。 Destroy(): 撤消一个队列。 IsEmpty(): 若队列空,则返回true ; 否则返回false。 IsFull(): 若队列满,则返回true; 否则返回false。 Front(x):在x中返回队头元素。操作成功返回true;否则返回false。 EnQueue(x):在队尾插入元素x。操作成功返回true;否则返回false。 DeQueue():从队列中删除队头元素。操作成功返回true;否则返回false Clear(): 清除队列中全部元素。 }10a1 a0栈s
图3-2 顺序栈
3.1 堆栈
3.1.2 栈的顺序表示 4. 在顺序存储表示下实现栈上定义的操作
(3)出栈(弹出)
template<class T> bool SeqStack<T>::Pop() { if(IsEmpty()) { //空栈处理 cout<<"Underflow"<<endl; return false; } top--; return true; } maxTop n-1 an-1 … … … top
3.1 堆栈
3.1.2 栈的顺序表示 1. 栈的顺序表示法
一维数组s存储栈中元素,
maxTop+1为最大允许容量, top指示栈顶,
maxTop n-1 an-1 … … … top
top==-1表示空栈,
top==maxTop表示栈满。 S=(a0,a1,…,an-1)
1
0
a1 a0
a0 a1 … an-1
出队
front rear
3.2 队列
3.2.1 队列抽象数据类型 1. 队列的定义
队列是限定在表的一端插入,在表 的另一端删除的线性数据结构。
若队列中无元素,则为空队列
队尾——允许插入元素的一端 队头——允许删除元素的另一端 Q=(a0,a1,…,an-1)
课堂提要
第3章 堆栈和队列 3.1 堆栈 3.2 队列 3.2.1 队列抽象数据类型 3.2.2 队列的顺序表示 3.2.3 队列的链接表示 3.3 表达式的计算 3.4 递归
3.1 堆栈
3.1.1 堆栈抽象数据类型 1. 堆栈的定义
堆栈是后进先出(Last In First Out——LIFO)的动态线 性数据结构。
A B C
堆栈工作的演示
3.1 堆栈
3.1.1 堆栈抽象数据类型 1. 堆栈的定义
同时,堆栈也是是后进先出(Last In First Out——LIFO)
1
0
a1 a0
栈s
图3-2 顺序栈
3.1 堆栈
3.1.2 栈的顺序表示 3. 动态一维数组描述顺序栈类
构造函数
template<class T> SeqStack<T>::SeqStack(int mSize) { maxTop=mSize-1; s=new T[mSize]; top=-1; } maxTop n-1 an-1 … … … top
1
0
a1 a0
栈s
图3-2 顺序栈
3.1 堆栈
3.1.3 栈的链接表示 1. 栈的链接表示法(链式栈)
链式栈的定义和操作的实现类似于单链表。
不带表头结点的单链表
top
课堂提要
an-1
an-2
an-3
…
a0
∧
图3-3 链式栈
第3章 堆栈和队列 3.1 堆栈 3.1.1 栈抽象数据类型 3.1.2 栈的顺序表示 3.1.3 栈的链接表示 3.2 队列 3.3 表达式的计算 3.4 递归
4、以表达式计算为例讨论堆栈的应用
5、介绍递归的概念和递归算法
3.1 堆栈
堆栈(简称栈)的示意图
S=(a0,a1,…,an-1) 入栈
a0 a1 … ai … an-1
出栈
bottom top
图3-1 栈的示意图
课堂提要
第3章 堆栈和队列 3.1 堆栈 3.2 队列 3.3 表达式的计算 3.4 递归
的动态线性数据结构。
堆栈工作的演示
C B A
3.1 堆栈
3.1.1 堆栈抽象数据类型 2. 栈的抽象数据类型
ADT Stack { 数据: 0个或多个元素的线性序列(a0,a1,...,an-1), 其最大允许长度为 MaxStackSize。其插入和删除运算都限制在同一端进行,并遵循 LIFO原则。 运算: Create(): 建立一个空栈。 Destroy(): 撤消一个栈。 IsEmpty():若栈空,则返回true; 否则返回 false。 IsFull(): 若栈满,则返回true; 否则返回 false。 Top(x): 返回栈顶元素。若操作成功,则返回true;否则返回false。 Push(x): 在栈顶插入元素x。 Pop(): 从栈中删除栈顶元素。 Clear(): 清除堆栈中全部元素。 }
2
3
4=maxSize-1
课堂提要
第3章 堆栈和队列 3.1 堆栈 3.2 队列 3.2.1 队列抽象数据类型 3.2.2 队列的顺序表示 3.2.3 队列的链接表示 3.3 表达式的计算 3.4 递归
(a) 空队列 fr 图中f为front, r为rear
3.2 队列
3.2.2 队列的顺序表示
1. 队列的顺序表示法
a0 a1 … an-1
出队
front rear
3.2 队列
3.2.1 队列抽象数据类型 1. 队列的定义
队列工作的演示(入队) A B C
front
rear
3.2 队列
3.2.1 队列抽象数据类型 1. 队列的定义
队列工作的演示(出队)
A
B
C
front
rear
3.2 队列
3.2.1 队列抽象数据类型 2. 队列的抽象数据类型
指针f指向队首元素的前一个位置,指针r指向队尾元素 0 1 2 3 4=maxSize-1 0 1 2 3 4=maxSize-1
20 30 40 50 r f (b) 元素20,30,40,50入队 50 r f (c) 元素20,30,40依次出队 从(d) 可以看到,当再有 元素需要入队时将产生‚溢 出‛,然而队列中尚有三个空 元素单元,我们称这种现象为 ‚假溢出‛。
数据结构A · 第 3章
第3章 堆栈和队列
引 言
堆栈和队列也是最常见的数据结构,在算法 设计中经常使用,它们在逻辑上同线性表一样, 都是线性结构,差别在于:线性表可以在表的任 意位置插入和删除元素,而堆栈和队列只能在表 的端点插入和删除元素。
第3章 堆栈和队列
内容提要
1、定义堆栈与队列抽象数据类型 2、讨论堆栈与队列的顺序表示方法 3、讨论堆栈与队列的链接表示方法