第3章栈和队列第5讲-队列的定义和顺序队

合集下载

数据结构课件第3章

数据结构课件第3章

0
1
2
3
4
5
6
7
a1
a2
a3
a4
a5
a6
a7
队头 F=0
队尾 R=7
a3 2 1 3 0 4 7 a3 5 6 3 a2 2 1 a1 0 F=0 a4 4 a5 5 6 a6 7 a7 R=0 R=7 3 a2 2 1 a1 0
a4 4 a5 5 6 a6 7
a8
F=0
a7
R=0
F=0
删除所有元素
top X W … B top
top=0 空栈
top
W

B A
top=m-1 元素X出栈
top
A
A
top=m 满栈
top=1 元素A入栈
例:堆栈的插入、删除操作。 出栈操作程序如下: # define m 1000; /*最大栈空间*/ 出栈操作算法: 1)栈顶指针top是否为0: typedef struct stack_stru 若是,则返回;若不是, { int s[m]; int top; }; 则执行2。 void pop (stack, y) 2)将栈顶元素送给y, struct stack_stru stack; 栈顶指针减1。 int *y; { if (stack.top = = 0) printf (“The stack is empty ! \n”); top Y Y else { top B B *y=stack.s[stack.top]; A A stack.top - -; } 出栈操作 }
top=p;
} 栈的入栈、出栈操作的时间复杂度都为O(1)。
栈的应用
一、 表达式求值 表达式由操作数、运算符和界限符组成。 运算符可包括算术运算符、关系运算符、逻辑运算符。

大学数据结构课件--第3章 栈和队列

大学数据结构课件--第3章 栈和队列
top top 栈空 F E D C B A
栈满 top-base=stacksize
top
F
E
D C B
top top top top top top base
入栈PUSH(s,x):s[top++]=x; top 出栈 POP(s,x):x=s[--top]; top
base
4
A
3.1 栈
例1:一个栈的输入序列为1,2,3,若在入栈的过程中 允许出栈,则可能得到的出栈序列是什么? 答: 可以通过穷举所有可能性来求解:
3.2 栈的应用举例
二、表达式求值
“算符优先法”
一个表达式由操作数、运算符和界限符组成。 # 例如:3*(7-2*3) (1)要正确求值,首先了解算术四则运算的规则 a.从左算到右 b.先乘除后加减 c.先括号内,后括号外 所以,3*(7-2*3)=3*(7-6)=3*1=3
9
3.2 栈的应用举例
InitStack(S); while (!QueueEmpty(Q))
{DeQueue(Q,d);push(S,d);}
while (!StackEmpty(S)) {pop(S,d);EnQueue(Q,d);} }
第3章 栈和队列
教学要求:
1、掌握栈和队列的定义、特性,并能正确应用它们解决实 际问题;
用一组地址连续的存储单元依次存放从队头到队尾的元素, 设指针front和rear分别指示队头元素和队尾元素的位置。
Q.rear 5 4 Q.rear 3 2 3 2 5 4 Q.rear 3 3 5 4 5 4
F E D C
C B A
Q.front
2 1 0
C B
Q.front 2 1 0

《数据结构及其应用》笔记含答案 第三章_栈和队列

《数据结构及其应用》笔记含答案 第三章_栈和队列

第3章栈和队列一、填空题1、栈是限定仅在表尾进行插入或删除操作的线性表。

2、栈的修改是按照后进先出的原则进行的。

3、队是一种先进先出的线性表。

4、把队列头尾相接的顺序存储结构称为循环队列。

5、队列也是一种操作受限的线性表,允许插入的一端叫做__队尾___,允许删除的一端叫做__队头__。

二、判断题1、栈和队列的存储,既可以采用顺序存储结构,又可以采用链式存储结构。

(√)2、任何一个递归过程都可以转换成非递归过程。

(√)3、若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列3,2,5,6,4,1。

(√)4、通常使用队列来处理函数的调用。

(╳)5、循环队列通常用指针来实现队列的头尾相接。

(╳)三、单项选择题1、若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在(C)种情况。

A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1解释:栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。

2、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为(C)。

A.i B.n-i C.n-i+1 D.不确定解释:栈是后进先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,说明1,2,3,…,n一次性全部进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1。

3、数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为(D)。

A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n。

数据结构练习题第三章栈、队列和数组习题及答案

数据结构练习题第三章栈、队列和数组习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。

在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。

2.栈的基本运算至少应包括________、________、________、________、________五种。

3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。

4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。

5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。

6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。

7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。

int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。

Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。

第3章栈和队列-数据结构与算法(第2版)-汪沁-清华大学出版社

第3章栈和队列-数据结构与算法(第2版)-汪沁-清华大学出版社

an
队头
队尾
队列示意图
入队
13
2、队列的基本运算
初始化队列 INIQUEUE(&Q)
将队列Q设置成一个空队列。
入队列
ENQUEUE(&Q,X)
将元素X插入到队尾中,也称“进队” ,“插入”。
出队列
DLQUEUE(&Q)
将队列Q的队头元素删除,也称“退队”、“删除”。
取队头元素 GETHEAD(Q)
也就是说,栈是一种后进先出(Last In First Out)的线性表,简称为LIFO表。
3
2、栈的运算
初始化栈:INISTACK(&S)
将栈S置为一个空栈(不含任何元素)。
进栈:PUSH(&S,X)
将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压 入”。
出栈: POP(&S)
删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹 出”。
9
三、链栈
typedef struct Lsnode { ElemType data;
struct Lsnode *next; } Lsnode *top;
一个链表栈由ቤተ መጻሕፍቲ ባይዱ顶指针top唯一确定。
10
1、链栈的主要运算
进栈操作 void Push(Lsnode *top; ElemType x)
{ p=(Lsnode *)malloc(sizeof(Lsnode)); p->data=x; p->next=top->next; top->next=p; }/*Push*/
第3章 栈和队列
1
栈和队列是二种特殊的线性表。是操作受 限的线 性表。 一、栈

南京晓庄学院数据结构题库参考标准答案

南京晓庄学院数据结构题库参考标准答案

南京晓庄学院数据结构题库参考标准答案数据结构与算法习题册(课后部分参考答案)《数据结构与算法》课程组⽬录课后习题部分第⼀章绪论 (1)第⼆章线性表 (3)第三章栈和队列 (5)第四章串 (8)第五章数组和⼴义表 (10)第六章树和⼆叉树 (13)第七章图 (16)第九章查找 (20)第⼗章排序 (23)第⼀章绪论⼀. 填空题1. 从逻辑关系上讲,数据结构的类型主要分为集合、线性结构、树结构和图结构。

2. 数据的存储结构主要有顺序存储和链式存储两种基本⽅法,不论哪种存储结构,都要存储两⽅⾯的内容:数据元素和数据元素之间的关系。

3. 算法具有五个特性,分别是有穷性、确定性、可⾏性、输⼊、输出。

4. 算法设计要求中的健壮性指的是算法在发⽣⾮法操作时可以作出处理的特性。

⼆. 选择题1. 顺序存储结构中数据元素之间的逻辑关系是由 C 表⽰的,链接存储结构中的数据元素之间的逻辑关系是由 D 表⽰的。

A 线性结构B ⾮线性结构C 存储位置D 指针2. 假设有如下遗产继承规则:丈夫和妻⼦可以相互继承遗产;⼦⼥可以继承⽗亲或母亲的遗产;⼦⼥间不能相互继承。

则表⽰该遗产继承关系的最合适的数据结构应该是B 。

A 树B 图C 线性表D 集合3. 算法指的是 A 。

A 对特定问题求解步骤的⼀种描述,是指令的有限序列。

B 计算机程序C 解决问题的计算⽅法D 数据处理三. 简答题1. 分析以下各程序段,并⽤⼤O记号表⽰其执⾏时间。

(1) (2)i=1;k=0; i=1;k=0;While(i{ {k=k+10*i; k=k+10*i;i++; i++;} }while(i<=n)⑴基本语句是k=k+10*i,共执⾏了n-2次,所以T(n)=O(n)。

⑵基本语句是k=k+10*i,共执⾏了n次,所以T(n)=O(n)。

2. 设有数据结构(D,R),其中D={1, 2, 3, 4, 5, 6},R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}。

数据结构-第3章-队列

数据结构-第3章-队列
下标 队头 0 1 2 3 4 5 队尾 6 7 8 9
a
front
b
c
d
e
f
g
rear
3.2 队列的顺序存储及实现
在使用队列前,先初始化队列,此时,队列为空,队头指针 front和 队尾指针rear都指向队列的第一个位置,即front=rear=0,如图3.3 所示。
下标 0 1 2 3 4 5 6Байду номын сангаас7 8 9
3.3 队列的链式存储及实现
(2)判断队列是否为空。 int QueueEmpty(LinkQueue *Q) {
return Q->rear==Q->front;
}
//头尾指针相等队列为空
3.3 队列的链式存储及实现
(3)将元素x入队。先为新结点申请一个空间,然后将x赋给数据 域,并使原队尾元素结点的指针域指向新结点,队尾指针指向新结点, 从而将结点加入队列中。操作过程如图3.20所示。
3.2 队列的顺序存储及实现
(4)入队
int EnQueue(CirQueue *Q , DataType x)
{ if(QueueFull(Q)) printf(“Queue overflow”); else{ Q->data[Q->rear]=x; Q->rear=(Q->rear+1)%QueueSize; } }
3.3 队列的链式存储及实现
链式队列的类型描述如下:
/*结点类型定义*/
typedef struct QNode { DataType data; struct QNode * next; } QueueNode; /*队列类型定义*/ typedef struct { QueueNode * front; //队头指针

数据结构栈和队列ppt课件

数据结构栈和队列ppt课件

栈的运用 例3.1 将一个十进制正整数N转换成r进制的数
N 〕
1835
229
28
3
N / 8 〔整除〕 N % 8〔求余
229
3

28
5
3
4
0
3

❖例3.2 算术表达式中括号匹配的检查
❖用栈来实现括号匹配检查的原那么是,对表达式从左 到右扫描。
❖〔1〕当遇到左括号时,左括号入栈;
❖〔2〕当遇到右括号时,首先检查栈能否空,假设栈 空,那么阐明该“右括弧〞多余;否那么比较栈顶左 括号能否与当前右括号匹配,假设匹配,将栈顶左括 号出栈,继续操作;否那么,阐明不匹配,停顿操作 。
❖在顺序栈上实现五种根本运算的C函数 ❖〔3〕入栈 ❖int push (SeqStack *s, DataType x) ❖{ if (s->top==MAXSIZE-1) /*栈满不能入栈*/ ❖{ printf("overflow"); ❖return 0; ❖} ❖ s->top++; ❖ s->data[s->top]=x; ❖ return 1; ❖}
链队列及运算的实现
采用链接方法存储的队列称为链队列〔Linked Queue〕
采用带头结点的单链表来实现链队列,链队列中 的t结ype点de类f st型ruc与t N单od链e 表一样。将头指针front和尾指针 re{arD封at装aTy在pe一da个ta;构造体中,链队列用C言语描画如 下:struct Node *next;
❖只设了一个尾指针r ❖头结点的指针,即r->next ❖队头元素的指针为r->next->next ❖队空的断定条件是r->next==r
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.2.1 队列的定义
队列简称队,它也是一种运算受限的线性表。
线性表
端点1
端点2
队列只能选取一个端点进行插入操作,另一个端点进 行删除操作
1/32
把进行插入的一端称做队尾(rear)。
进行删除的一端称做队首或队头(front)。
向队列中插入新元素称为进队或入队,新元素进队后就成 为新的队尾元素。
从队列中删除元素称为出队或离队,元素出队后,其后继 元素就成为队首元素。

f front
r rear
data 顺序队的示意图
8/32
例如:MaxSize=5
(a)空队
(b)a进队 4 3 2 1 0
4 3 2 1 0
(c)b、c、 d、e进队 rear e d c b a
(rear front
a
rear 4 front 3 2 1 0
16/32
解决方案 把数组的前端和后端连接起来,形成一个环形的顺序表, 即把存储队列元素的表从逻辑上看成一个环,称为环形队列 或循环队列。 例 如
rear c b a
front
4 3 2 1 0
a b c rear 当rear=4时,下一步 到位置0,可以进队
3 4 2 1 0
front
当rear=4时,不能 再进队
27/32
bool EnQueue(QuType *&qu,ElemType x) //进队运算算法 { int rear; //临时队尾指针 if (qu->count==MaxSize) //队满上溢出 return false; else 它是一个局部变量, {qu中不保存该值 rear=(qu->front+qu->count)%MaxSize; //求队尾位置 队列 rear=(rear+1)%MaxSize; //队尾循环增1 qu->data[rear]=x; qu->count++; //元素个数增1 return true; } }
出队一个 元素:
rear
d c b
front
4 3 2 1 0
rear
d c
front
4 3 2 1 0
15/32
2、环形队列(或循环队列)中实现队列的基本运算
rear c b 4 3 2 1 0 还有两个位置, 为何不能进队?
a
front
这是因为采用 rear==MaxSize-1 作为队满条件的缺陷。 当队满条件为真时,队中可能还有若干空位置。 这种溢出并不是真正的溢出,称为假溢出。
13/32
(4)进队列enQueue(q,e) 在队列不满的条件下,先将队尾指针rear循环增1,然后将 元素添加到该位置。
空队时元 素a进队: rear front
4 3 2 1 0
rear front
a
4 3 2 1 0 14/32
(5)出队列deQueue(q,e) 在队列q不为空的条件下,将队首指针front循环增1,并 将该位置的元素值赋给e。
//出队运算算法 //队空下溢出
//队头循环增1 //元素个数减1
29/32
30/32
注意:
31/32
━━本讲完━━
32/32
逻辑结构
顺序队
链队
存储结构
6/32
3.2.2 队列的顺序存储结构及其基本运算的实现
顺序队类型SqQueue定义如下:
因为队列两端都在变化,所以需要两个指针来标识队 列的状态。
7/32
逻辑结构
队列 (a1,a2,…,ai,…an )
直接映射 0 存储结构 … f f+1 a1 … r an …
MaxSize-1
21/32
环形队列的4要素:
在环形队列中,实现队列的基本运算算法与非环形队列类 似,只是改为上述4要素即可。
22/32
【例 3-7】 对于环形队列来说,如果知道队头指针
和队列中元素个数,则可以计算出队尾指针。也就是说,
可以用队列中元素个数代替队尾指针。 设计出这种环形队列的初始化、入队、出队和判空 算法。
出队
队头 队尾
进队
队列示意图
2/32
队列的主要特点是先进先出,所以又把队列称为先进先 出表。 例如:
假如5个人 过独木桥
只能按上桥的 次序过桥
这里独木桥就是一个队列
3/32
队列抽象数据类型=逻辑结构+基本运算(运算描述)
4/32
5/32
既然队列中元素逻辑关系与线性表的相同,队列可以
采用与线性表相同的存储结构。 队列
4 3 2 1 0 rear front
11
(2)销毁队列DestroyQueue(q) 释放队列q占用的存储空间。
12/32
(3)判断队列是否为空QueueEmpty(q)
若队列q满足q->front==q->rear条件,则返回true;否则
返回false。
bool QueueEmpty(SqQueue *q) { return(q->front==q->rear); }
front
9/32
队列的各种状态
4 3 2 1 0 rear front (a)空队 4 3 2 1 0 rear
rear front
a
e d c b a
4 rear front 3 2 1 0
4 3 2 1 0
front (c)b、c、 d、e进队 (d)全部出队
(b)a进队
顺序队的4要素(初始时front=rear=-1):
rear=(front+count)%MaxSize
已知rear、count,求front:
front=(rear-count+MaxSize)%MaxSize
25/32
解:依题意设计的环形队列类型如下:
由front和count求出
注意:这样的环形队列中最多可放置MaxSize个元素。
26/32
对应的算法如下:
28/32
bool DeQueue(QuType *&qu,ElemType &x) { if (qu->count==0) return false; else { qu->front=(qu->front+1)%MaxSize; x=qu->data[qu->front]; qu->count--; return true; } }
3 4
2
1 0
rear c
3 4
b
2 1 0
a
front rear (a)空队 b c
3 4 2
front (b)a、b、c进队 front
rear
1
0
rear front
3 4
2
1
0
(c)出队一次
(d)出队2次 19/32
现在约定rear=front为队空,以下两种情况都满足该条件:
front
23/32
已知front、rear,求队中元素个数count = ?
MaxSize=5 rear c 3
4
b
2
1 0
front a a front
3 4
2
1 0
rear c
b
count=(3-0)=3
count=(1-3)=-2

count=rear-front
?
count=(1-3+MaxSize)=3
原来如此, 简单!
17/32
环形队列:
b c d rear front
3 4 2 1 0
a
实际上内存地址一定是连续的,不可能是环形的,这 里是通过逻辑方式实现环形队列,也就是将rear++和 front++改为:
rear=(rear+1)%MaxSize front=(front+1)%MaxSize 18/32
3 4 2 1 0
rear
3 4
2
1 0
front
rear 初始状态 进队的所有元素均出队
那么如何设置队满的条件呢?
20/32
让rear=front为队空条件,并约定
(rear+1)%MaxSize=front 为队满条件。
进队一个元素时 到达队头,就认 为队满了。这样 做会少放一个元 素,牺牲一个元 素没关系的
count=(3-0+MaxSize)=8

count=(1-3+MaxSize)%MaxSize=3

count=(3-0+MaxSize)%MaxSize=3

24/32
已知front、rear,求队中元素个数count:
count=(rear-front+MaxSize)%MaxSize
已知front、count,求rear:
队空条件:front = rear
队满条件:rear = MaxSize-1
元素e进队:rear++; data[rear]=e; 元素e出队:front++; e=data[front];
注意:rear指向队尾元素; front指向队头元素的前 一个位置。 10/32
1、 顺序队中实现队列的基本运算 (1)初始化队列InitQueue(q) 构造一个空队列q。将front和rear指针均设置成初始状 态即-1值。
相关文档
最新文档