第03章_栈和队列B

合集下载

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

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

第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。

数据结构第六次课-栈和队列B

数据结构第六次课-栈和队列B
例4:表达式求值
设计思路:用栈暂存运算符
第4页
❖回文游戏:顺读与逆读字符串一样(不含空格)
1.读入字符串
d
top 2.压入栈
a
3.原串字符与出栈字符依次比较
d
若不等,非回文
字符串:“madam I madam”
若直到栈空都相等,则是回文
“上海自来水来自海上” 有没有更简洁的办法呢?
(读入字符串,压入n/2个字符,n为字符个数)
第8页
表达式表示法
算术表达式中最常见的表示法形式有 中缀、前缀
和 后缀表示法。中缀表示法是书写表达式的常见方式,
而前缀和后缀表示法主要用于计算机科学领域。
➢中缀表示法 Syntax: operand1 operator operand2 Example: (A+B)*C-D/(E+F) ➢前缀表示法 -波兰表示法(Polish notation,PN) Syntax : operator operand1 operand2 Example : -*+ABC/D+EF ➢后缀表示法 -逆波兰表示法(Reverse Polish Notation,RPN) Syntax : operand1 operand2 operator Example : AB+C*DEF+/- 无操作符优先级问题,求值简单
第7页
❖ 表达式求值( 这是栈应用的典型例子 )
这里,表达式求值的算法是 “算符优先法”。
例如:3*(7 – 2 ) (1) 要正确求值,首先了解算术四则运算的规则:
a. 从左算到右 b. 先乘除,后加减 c. 先括号内,后括号外 由此,通常此表达式的计算顺序为:
3*(7 – 2 )= 3 * 5 = 15

数据结构栈和队列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

栈和队列答案

栈和队列答案

第3章栈和队列答案一、填空题1. 向量、栈和队列都是线性结构,可以在向量的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。

2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。

不允许插入和删除运算的一端称为栈底。

3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。

4. 在具有n个单元的循环队列中,队满时共有 n-1 个元素。

5. 带表头结点的空循环双向链表的长度等于0。

解:Array二、判断正误(×)1. 在表结构中最常用的是线性表,栈和队列不太常用。

错,不一定吧调用子程序或函数常用,CPU中也用队列。

(√)2. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。

(√)3. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。

正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。

(×)4. 栈和链表是两种不同的数据结构。

错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。

(×)5. 栈和队列是一种非线性数据结构。

错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。

(√)6. 栈和队列的存储方式既可是顺序方式,也可是链接方式。

(√)7. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。

(×)8. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。

错,后半句不对。

(×)9. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。

错,有可能。

三、单项选择题( B)1. 栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(C)2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为A.i B.n=i C.n-i+1 D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,…,n,则出栈的序列是n,…,3,2,1。

栈与队列(java版)

栈与队列(java版)

an-2
栈底
3.1.4 链栈及其基本操作的实现
1. 链栈
思考
栈空条件?
栈的长度?
栈顶元素?
如下问题如何描述?
top==null
需从栈顶开始沿着next指针依次对结点逐个进行点数才能确定。
top.getData( )
top

a0
an-1
an-2
3.1.4 链栈及其基本操作的实现
2. 链栈类的描述(书中P73-74)
(2)算法步骤:
2)顺序栈的出栈操作 pop() 的实现(算法 3.2)
a)若栈空,则返回空值
b)若栈不空,则移去栈顶元素并返回其值
if (top==0) return null;
a1
a2
an
… …
an-1
top
或 if (isEmpty()) return null;
第三章 栈与队列
单击此处添加文本具体内容
PART.01
目录
CONTENTS
01
单击添加文本具体内容
05
单击添加文本具体内容
03
单击添加文本具体内容
02
单击添加文本具体内容
04
单击添加文本具体内容
重点:
CONTENTS
01
单击添加文本具体内容
05
单击添加文本具体内容
03
单击添加文本具体内容
02
单击添加文本具体内容
栈和队列是两种操作受限的线性表,是两种常用的数据类型。
(1) 栈是仅限制在表尾进行插入和删除操作的特 殊线性表,限制操作的表尾端称为“栈顶”, 另一 端称为“栈底”
a0 a1 a2 … an-1

数据结构栈和队列B

数据结构栈和队列B
J4 J5
5
front
rear
问3: 在具有n个单元的循 环队列中,队满时共有多少 个元素? N-1个
3.2 队列
20
循环队列:

队列存放数组被当作首尾相接的表处理。
队头、队尾指针加1时从maxSize -1直接进到0,可用语言的取 模(余数)运算实现。

队空: 队满: 入队: 出队: 求队长:
Q.front =Q. rear Q.front =(Q.rear + 1) % maxSize Q.rear = (Q.rear + 1) % maxSize Q.front = (front + 1) % maxSize; (Q.rear-Q.front+maxSize)%maxSize
rear
M-1 0 1
实现:利用“模”运算 入队:rear=(rear+1)%M; sq[rear]=x; 出队:front=(front+1)%M; x=sq[front]; 队满、队空判定条件
front
循环队列示意图:
假上溢的解决办法 把顺序队列看成首尾相接的环(钟表)-循环队列 基本操作的实现
队空条件 : front = rear (初始化时:front = rear ) 队满条件: front = (rear+1) % N (N=maxsize) 队列长度(即数据元素个数):L=(N+rear-front)% N
6 问1:左图中队列maxsize N=?
J2 J1 J3
问2:左图中队列长度L=?
链队列类型定义: typedef struct { QueuePtr front ; //队首指针 QueuePtr rear ; //队尾指针 } LinkQueue;

数据结构-使用C语言 朱战立 第3章堆栈和队列

数据结构-使用C语言 朱战立 第3章堆栈和队列

top
D top C B A
D C B A
top
D C B A
top
顺序栈出栈函数的核心语句: S->top --; d = S->stack[S->top];
17
例5、 设依次进入一个栈的元素序列为c,a,b,d,则 可得到出栈的元素序列是:
A)a,b,c,d C)b,c,d,a
B)c,d,a,b D)a,c,d,b
初始化堆栈S 堆栈S非空否 入栈 出栈 取栈顶数据元素
11
二、堆栈的顺序表示和实现 1、顺序(堆)栈
顺序存储结构的堆栈。
顺序栈S an an-1 …… 栈顶top
2、顺序栈的存储结构
它是利用一组地址连续的存储 单元依次存放自栈底到栈顶的数据 元素,同时设指针top指示当前栈顶 位置。
ai …… a1 a0
具体方法:顺序扫描算术表达式(表现为一个字符串), 当遇到三种类型的左括号时让该括号进栈; 1. 当扫描到某一种类型的右括号时,比较当前栈顶括号是 否与之匹配,若匹配则退栈继续进行判断; 2. 若当前栈顶括号与当前扫描的括号不相同,则左右括号 配对次序不正确; 3. 若字符串当前为某种类型左括号而堆栈已空,则右括号 多于左括号; 4. 字符串循环扫描结束时,若堆栈非空(即堆栈中尚有某 种类型左括号),则说明左括号多于右括号;否则,左 右括号匹配正确。
14
顺序栈S
高地址
栈顶top
an an-1 …… ai …… a1 a0 入栈口诀:堆栈指针top “先 压后加” : S[top++]=an 栈底base 出栈口诀:堆栈指针top “先 减后弹” : e=S[--top]
低地址
栈不存在的条件: base=NULL; 栈为空的条件 : base=top或top<=0; 栈满的条件 : top-base=MaxSize;

数据库系统l试题库及答案第3章栈与队列

数据库系统l试题库及答案第3章栈与队列

第3章栈和队列3.1栈一、填空题1. 线性表、栈和队列都是________ 结构,可以在线性表的__________ 位置插入和删除元素;对于栈只能___________插入和删除元素;对于队列只在 ____________ 插入元素,并且只在____________ 删除元素。

2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为____________ 。

不允许插入和删除运算的一端称为_________ 。

3. 向栈中压入元素的操作是先____________ ,后 _______ 。

4. 从栈中弹出元素的操作是先____________ ,后 ________ 。

二、选择题:1. ()栈中元素的进出原则是()。

A.先进先出 B .后进先出C .栈空则进D .栈满则出2. ()若已知一个栈的入栈序列是1 , 2, 3,…,n,其输出序列为pl, p2, p3,…,pn,若p仁n,贝U pi为()。

A. i B . n=i C . n-i+1 D .不确定3. ()判定一个栈ST (最多元素个数为m0)为空的条件是()。

A. ST->top<>0 B . ST->top=0 C . ST->top<>mO D . ST->top=mO4. ()有六个元素1,2,3,4,5,6 的顺序进栈,问下列哪一个不是合法的出栈序列?()A. 1,2,3,4,5,6B. 5,4,3,2,1,6C. 4,3,2,1,5,6D. 6,5,4,3,1,25. ()将递归算法转换成非递归算法时,通常要借助的数据结构是()。

A.线性表B. 栈C. 队列D. 树6. ()若栈采用顺序存储方式存储,现两栈共享空间V[1..m] , top[i]代表第i个栈(i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。

A. |top[2]-top[1]|=0B. top[1]+1=top[2]C. top[1]+top[2]=mD. top[1]=top[2]7. ()一个递归算法必须包括()。

数据结构课程-栈和队列B

数据结构课程-栈和队列B

循环队列的操作实现见教材P64 循环队列的操作实现见教材P64 见教材
18
Status InitQueue(SqQueue &Q){ //构造一个空队列 构造一个空队列Q 构造一个空队列 Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OVERFLOW); Q.front=Q.rear=0; return OK;} int QueueLength(SqQueue Q){ //返回 的元素个数,即队列长度 返回Q的元素个数 返回 的元素个数, return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE}
第三章 栈和队列
3.1 栈(Stack) ) 3.2 队列(Queue) )
1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
1
3.2 队列
1. 定 只能在表的一端进行插入运算, 义 只能在表的一端进行插入运算,在表的另 头删尾插) 一端进行删除运算的线性表 (头删尾插) 2. 逻辑结构 与线性表相同,仍为一对一关系。 与线性表相同,仍为一对一关系。 顺序队或链队,以循环顺序队更常见。 3. 存储结构 顺序队或链队,以循环顺序队更常见。 只能在队首和队尾运算, 4. 运算规则 只能在队首和队尾运算,且访问结点 时依照先进先出 FIFO)的原则。 先进先出( 时依照先进先出(FIFO)的原则。 关键是掌握入队和出队操作, 5. 实现方式 关键是掌握入队和出队操作,具体实 入队 操作 现依顺序队或链队的不同而不同。 现依顺序队或链队的不同而不同。 基本操作有入队或出队,建空队列, 基本操作有入队或出队,建空队列, 判队空或队满等操作。 判队空或队满等操作。

最完整的数据结构1800题包括完整答案第3章 栈和队列

最完整的数据结构1800题包括完整答案第3章  栈和队列

第3章栈和队列一选择题1. 对于栈操作数据的原则是()。

A. 先进先出B. 后进先出C. 后进后出D. 不分顺序2. 在作进栈运算时,应先判别栈是否( ① ),在作退栈运算时应先判别栈是否( ② )。

当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( ③ )。

为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的 ( ④ )分别设在这片内存空间的两端,这样,当( ⑤ )时,才产生上溢。

①, ②: A. 空 B. 满 C. 上溢 D. 下溢③: A. n-1 B. n C. n+1 D. n/2④: A. 长度 B. 深度 C. 栈顶 D. 栈底⑤: A. 两个栈的栈顶同时到达栈空间的中心点.B. 其中一个栈的栈顶到达栈空间的中心点.C. 两个栈的栈顶在栈空间的某一位置相遇.D. 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底.3. 一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是()。

A. 不确定B. n-i+1C. iD. n-i4. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是()。

A. i-j-1B. i-jC. j-i+1D. 不确定的5. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,p N,若p N是n,则p i是( )。

A. iB. n-iC. n-i+1D. 不确定6. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?()A. 5 4 3 6 1 2B. 4 5 3 1 2 6C. 3 4 6 5 2 1D. 2 3 4 1 5 67. 设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。

A. 1,2,4,3,B. 2,1,3,4,C. 1,4,3,2,D. 4,3,1,2,E. 3,2,1,4,8. 一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是()。

数据结构第六次课-栈和队列B-课件

数据结构第六次课-栈和队列B-课件

1.读入字符串
d
top 2.压入栈
a
3.原串字符与出栈字符依次比较
d
若不等,非回文
字符串:“madam I madam”
若直到栈空都相等,则是回文
“上海自来水来自海上” 有没有更简洁的办法呢?
(读入字符串,压入n/2个字符,n为字符个数)
❖多进制输出:
例 把十进制数159转换成八进制数
8 159 余 7
8 19
余3
82
余2
0
(159)10=(237)8
23 7
top 7
电气信息学院 计算机系
top 3 7
top top
2 3 7
第5页
数据结构
❖多进制输出:
例 把十进制数159转换成八进制数
top
8 159
8 19 82
0
余7 余3 余2
23 7
top 7
top 3 7
top 2 3
7
(159)10=(237)8
}
}
System.out.println(binStr);
电气信息学院 计算机系
第6页
数据结
❖多进制输出:
例 把十进制数159转换成八进制数
import java.util.*;
class T
{
public static void main(String[] args)
{
System.out.println(toOctal(159));
}
}
电气信息学院 计算机系

第7页
数据结构
❖ 表达式求值( 这是栈应用的典型例子 )
这里,表达式求值的算法是 “算符优先法”。

数据结构(C语言版第2版)课后习题答案严蔚敏版

数据结构(C语言版第2版)课后习题答案严蔚敏版

数据结构(C语⾔版第2版)课后习题答案严蔚敏版数据结构(C语⾔版 第2版)课后习题答案 严蔚敏 等 编著,仅供参考,还是⾃⼰认真做了再看第1章 绪论5.选择题(1)在数据结构中,从逻辑上可以把数据结构分成( C )。

A.动态结构和静态结构 B.紧凑结构和⾮紧凑结构C.线性结构和⾮线性结构 D.内部结构和外部结构(2)与数据元素本⾝的形式、内容、相对位置、个数⽆关的是数据的( C )。

A.存储结构 B.存储实现C.逻辑结构 D.运算实现(3)通常要求同⼀逻辑结构中的所有数据元素具有相同的特性,这意味着( B )。

A.数据具有同⼀特点B.不仅数据元素所包含的数据项的个数要相同,⽽且对应数据项的类型要⼀致C.每个数据元素都⼀样D.数据元素所包含的数据项的个数要相等(4)以下说法正确的是( D )。

A.数据元素是数据的最⼩单位B.数据项是数据的基本单位C.数据结构是带有结构的各数据项的集合D.⼀些表⾯上很不相同的数据可以有相同的逻辑结构解释:数据元素是数据的基本单位,数据项是数据的最⼩单位,数据结构是带有结构的各数据元素的集合。

(5)算法的时间复杂度取决于( D )。

A.问题的规模 B.待处理数据的初态C.计算机的配置 D.A和B解释:算法的时间复杂度不仅与问题的规模有关,还与问题的其他因素有关。

如某些排序的算法,其执⾏时间与待排序记录的初始状态有关。

为此,有时会对算法有最好、最坏以及平均时间复杂度的评价。

(6)以下数据结构中,( A )是⾮线性数据结构A.树 B.字符串 C.队列 D.栈6.试分析下⾯各程序段的时间复杂度。

(1)x=90; y=100;while(y>0)if(x>100){x=x-10;y--;}else x++;答案:O(1)解释:程序的执⾏次数为常数阶。

(2)for (i=0; i<n; i++)for (j=0; j<m; j++)a[i][j]=0;答案:O(m*n)解释:语句a[i][j]=0;的执⾏次数为m*n。

《栈和队列》课件

《栈和队列》课件

栈和队列的本质思想是
实现方式的重要性
通过限制插入和删除的
理解栈和队列的概念以
方式,实现了数据的有
及它们不同的实现方式
序存储和操作。
对于和队列在算法和
数据结构中的广泛 应用
栈和队列作为基本的数
据结构,在算法和数据
结构的设计中有着广泛
的应用。
1 Enqueue
插入元素到队列尾部。
2 Dequeue
从队列头部删除元素。
3 Front
获取队列头部元素的值,不改变队列的状 态。
4 isEmpty
判断队列是否为空。
队列的应用
约瑟夫问题
通过模拟元素出队/入队的 过程,解决经典的约瑟夫 问题。
循环队列
使用数组实现的循环队列, 可以有效地利用存储空间。
1 Push
将元素压入栈顶。
3 Peek
获取栈顶元素的值,不改变栈的状态。
2 Pop
将栈顶元素弹出。
4 isEmpty
判断栈是否为空。
栈的应用
中缀表达式转后缀表 达式
利用栈的特性将中缀表达 式转换为后缀表达式,方 便计算机进行计算。
括号匹配问题
利用栈判断一个表达式中 的括号是否匹配。
计算器程序
使用栈来实现简单的计算 器,可以进行基本的加减 乘除运算。
队列与广度优先搜索
在图的遍历过程中,广度 优先搜索需要使用队列来 保存未访问的节点。
栈和队列的比较
1 栈和队列的异同
栈和队列都是线性表,但栈是后进先出,队列是先进先出。
2 栈和队列的不同应用场景
栈在表达式求值和程序调用等领域有广泛应用,而队列在调度和模拟等领域有广泛应用。
总结

数据结构 栈和队列B

数据结构 栈和队列B
(常用循环顺序队) 常用循环顺序队)
5
链队列示意图
rear Q front p
a1 (队首 队首) 队首 a2 a3 ^ (队尾 队尾) 队尾
front rear
讨论: 讨论:
空队列的特征? ① 空队列的特征? fro为删除时有free动作 除非内存不足! ② 队列会满吗?一般不会,因为删除时有 动作。除非内存不足! 怎样实现入队和出队操作? ③ 怎样实现入队和出队操作? 完整动作设计参 入队(尾部插入): ):rear->next=S; rear=S; 见教材 入队(尾部插入): 见教材P61-62 出队(头部删除): ):front->next=p->next; 出队(头部删除):
6
3.2 队列 讨论: 讨论:
Q
顺序队示意图
data
空队列的特征? ① 空队列的特征? 约定: 约定:front=rear 队列会满吗? ② 队列会满吗?
很可能会, 很可能会,因为数组前 端空间无法释放。 端空间无法释放。因此 数组应当有长度限制。 数组应当有长度限制。
front
0 . . . . .
新开单元的地址为0则表示内存不足 新开单元的地址为 则表示内存不足
&q )
if (!q.base) exit(OVERFLOW);//失败,退出程序 失败, 失败 q.front =q.rear=0;//置空队列 置空队列 return OK; }//InitQueue;
15
2) 入队操作 ) 算法说明: 算法说明:向循环队列的队尾插入一个元素 分 析: (1) 插入前应当先判断队列是否满 if (( q . rear + 1 ) % QUEUE_MAXSIZE )==q.front) return ERROR; (2)插入动作 ) q.base [q.rear] = e; q.rear = ( q . rear + 1 ) % QUEUE_MAXSIZE;

《数据结构》习题汇编03 第三章 栈和队列 试题上课讲义

《数据结构》习题汇编03 第三章 栈和队列 试题上课讲义

《数据结构》习题汇编03第三章栈和队列试题第三章栈和队列试题一、单项选择题1.栈的插入和删除操作在()进行。

A. 栈顶B. 栈底C. 任意位置D. 指定位置2.当利用大小为n的数组顺序存储一个栈时,假定用top==n表示栈空,则向这个栈插入一个元素时,首先应执行()语句修改top指针。

A. top++;B. top--;C. top = 0;D.top;3.若让元素1,2,3依次进栈,则出栈次序不可能出现()种情况。

A. 3, 2, 1B. 2, 1, 3C. 3, 1, 2D.1, 3, 24.在一个顺序存储的循环队列中,队头指针指向队头元素的()位置。

A. 前一个B. 后一个C. 当前D.后面5.当利用大小为n的数组顺序存储一个队列时,该队列的最大长度为()。

A. n-2B. n-1C. nD. n+16.从一个顺序存储的循环队列中删除一个元素时,需要()。

A. 队头指针加一B. 队头指针减一C. 取出队头指针所指的元素D. 取出队尾指针所指的元素7.假定一个顺序存储的循环队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。

A. front+1 == rearB. rear+1 == frontC. front == 0D. front == rear8.假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。

A. front == rearB. front != NULLC. rear != NULLD. front == NULL9.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。

若想在链式栈的栈顶插入一个由指针s所指的结点,则应执行操作()。

A. top->link = s;B.s->link = top->link;top->link = s;C. s->link = top; top = s;D. s->link = top; top = top->link;10.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。

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

入队或出队,建空队列,判队空或队满等操作。
3.2 队列 3
队列的基本操作(教材p.59--60):
InitQueue(&Q) 操作结果:构造一个空队列Q。 DestroyQueue(&Q) 初始条件:队列Q已存在。 操作结果:队列Q被销毁,不再存在。 QueueEmpty(Q) 初始条件:队列Q已存在。 操作结果:若Q为空队列,则返回TRUE,否则返回FALSE。 QueueLength(Q) 初始条件:队列Q已存在。 操作结果:返回Q的元素个数,即队列的长度。 ClearQueue(&Q) 初始条件:队列Q已存在。 操作结果:将Q清为空队列。
S
D
① 空链队的特征? front==rear
^
② 链队会满吗? 一般不会,因为删除时有free动作。除非内存不足!
③ 怎样实现链队的入队和出队操作?
入队(尾部插入):rearnext=S; rear=S; 出队(头部删除):p=front->next; front->next=p->next; free(p);
顺序队操作示意图:
5 4 3 2 rear=3
5
4 3 rear=3 front=3
5
4 3
2 1 0 J1,J2,J3出队
J3 front=0 J2 J1
2 1 0
front=0 rear=0 队空
1 0
பைடு நூலகம்
J1,J1,J3入队
空队列条件:front==rear 入队列:sq[++rear]=x; 出队列:x=sq[++front];
队空条件 : front = rear (初始化时:front = rear ) 队满条件: front = (rear+1) % N (N=maxsize) 队列长度(即数据元素个数):L=(N+rear-front)% N
6 问1:左图中队列maxsize N=?
J2 J1 J3
问2:左图中队列长度L=?
有空位置,这就叫“假溢出”。
解决假溢出的途径——— 采用循环队列
3.2 队列
15
循环队列示意图: 当J6 入队后, 队尾指针Q.rear越界,不可能 再插入新的队尾元素,但是另一方面,队列的 实际可用空间并未占满。一个巧妙的办法是, 将顺序队列设想为首尾相连的环状空间,当 Q.rear 值超出队列空间的最大位置时,令 Q.rear= 0,使队列空间能“循环”使用。这 种循环使用空间的队列称为循环队列。
第三章 栈和队列
3.2 队列(Queue)
1. 基本概念 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
第三章:栈和队列
1
队列的基本概念
队列 (Queue)是仅在表尾进行插入操作,在表头进行删除操 作的线性表。它是一种先进先出(FIFO)的线性表。
队首 队尾
a1 , a2 , a3 在队首删除元素称为出队 。
GetHead(Q, &e) 初始条件:Q为非空队列。 操作结果:用e返回Q的队头元素。
a1 a 2
……
an
EnQueue(&Q, e) front 初始条件:队列Q已存在。 操作结果:插入元素e为Q的新的队尾元素。
a1 a2
……
an e
DeQueue(&Q, &e) 初始条件:Q为非空队列。 rear 操作结果:删除Q的队头元素,并用e返回其值。
rear =6 J6 J5 front=3 J4 5 4 3 2 1 0 J4,J5,J6入队
设两个指针front,rear,约定: rear指示队尾元素前一位置; front指示队头元素 初值front=rear=0
问:什么叫“假溢出” ?如何解决? 答:在顺序队中,当尾指针已经到了数组的
上界,不能再有入队操作,但其实数组中还
rear
M-1 0 1
实现:利用“模”运算 入队:rear=(rear+1)%M; sq[rear]=x; 出队:front=(front+1)%M; x=sq[front]; 队满、队空判定条件
front
循环队列示意图:
假上溢的解决办法 把顺序队列看成首尾相接的环(钟表)-循环队列 基本操作的实现
3.2 队列 7
链队入队出队示意图: Q.front
空队列
∧ 元素X入队列 X ∧ 元素Y入队列 X Y ∧
Q.rear
Q.front
Q.rear
Q.front
Q.rear
Q.front
Q.rear
X
元素X出队列
Y

链队入队的实现 (教材p62): Status EnQueue ( LinkQueue &Q, QElemType e ) { // 插入元素e为Q的新的队尾元素 p = (QueuePtr) malloc (sizeof (Qnode)); if (!p) exit(ERROR); //存储分配失败 p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; return OK; }
J4 J5
5
front
rear
问3: 在具有n个单元的循 环队列中,队满时共有多少 个元素? N-1个
3.2 队列
20
循环队列:

队列存放数组被当作首尾相接的表处理。
队头、队尾指针加1时从maxSize -1直接进到0,可用语言的取 模(余数)运算实现。

队空: 队满: 入队: 出队: 求队长:
Q.front =Q. rear Q.front =(Q.rear + 1) % maxSize Q.rear = (Q.rear + 1) % maxSize Q.front = (front + 1) % maxSize; (Q.rear-Q.front+maxSize)%maxSize
基本操作的实现
初始化空队:Q.front=Q.rear=0;
入队:判断是否队满;非队满时,Q.rear位置放新插入 的元素, Q.rear++ 出队:判断是否队空,非队空时,Q.front位置为待删除 的元素, Q.front++
队空条件:Q.front == Q.rear
队满条件:Q.rear == MAXQSIZE 问题:假上溢!
, ……….,an-1 ,
an
在队尾插入元素称为入队
问:为什么要设计队列?它有什么用途?
离散事件的模拟(模拟事件发生的先后顺序 ) 操作系统中的作业调度(一个CPU执行多个作业) 简化程序设计。
3.2 队列 2
队列的基本概念
队尾插入,
队列定义 逻辑结构 存储结构 运算规则 实现方式 基本操作
只能在表的一端进行插入运算,在表的另一 端进行删除运算的线性表。 队头删除 与线性表相同,仍为一对一关系。 顺序队或链队,以循环顺序队更常见。 只能在队首和队尾运算,且访问结点时依照 先进先出(FIFO)的原则。 关键是掌握入队和出队操作,具体实现依顺 序队或链队的不同而不同。

问题:队空和队满的判断条件一样
顺序队列 0 front 1 2 3 . rear a1
循环队列(臆造) N-1 0
1
a1 rear a3 a2 front
a2
a3
2
.
N-1
3
新问题:在循环队列中,空队特征是front=rear;队满时也会有 front=rear;判决条件将出现二义性! 解决方案有三:
循环队列入队的实现 (教材p65):
Status EnQueue (SqQueue &Q, QElemType e) {// 插入元素e为Q的新的队尾元素 if ((Q.rear+1) % MAXQSIZE = Q.front) return ERROR; //队列满 Q.base[Q.rear] = e; Q.rear = (Q.rear+1) % MAXQSIZE; return OK;
}
循环队列出队的实现 (教材p65):
Status DeQueue (SqQueue &Q, QElemType &e) {// 若队列不空,则删除Q的队头元素, // 用e返回其值,并返回TRUE; 否则返回FALSE if (Q.front == Q.rear) return ERROR; e = Q.base[Q.front]; Q.front = (Q.front+1) % MAXQSIZE; return OK; }
q . base=(QElemType *)
malloc(sizeof (QElemType)* MAXQSIZE); //分配空间
3.2 队列 11
顺序队示意图:
用base做数组名
讨论:
Q
① 空队列的特征? 约定:front=rear ② 队列会满吗? 极易装满!因为数组通 常有长度限制,而其前 端空间无法释放。 ③ 怎样实现入队和出队 操作?核心语句如下:
①使用一个计数器记录队列中元素个数(即队列长度); ②加设标志位,删除时置1,插入时置0,则可识别当前front=rear属于何种情况 ③ 人为浪费一个单元,则队满特征可改为front=(rear+1)%N;
3.2 队列 19
实际中常选用方案3(人为浪费一个单元): 即front和rear二者之一指向实元素,另一个指向空闲元素。
Q.rear J6 J5 Q.front J4
5
4 3
2
J6 5 2 Q.rear 0 1 1 0
J5
Q.front
相关文档
最新文档