当前位置:文档之家› 数据结构之队列小结

数据结构之队列小结


循环队列和链队列的比较 时间性能: 循环队列和链队列的基本操作都需要常数时间O (1)。 空间性能: 循环队列:必须预先确定一个固定的长度,所以有 存储元素个数的限制和空间浪费的问题。 链队列:没有队列满的问题,只有当内存没有可用 空间时才会出现队列满,但是每个元素都需要一个 指针域,从而产生了结构性开销。
p a1
8
front
a2
an ∧ rear 数据结构
3.4.3 循环队列-队列的顺序表示和实现
出队
0 a6
1
2 a3
3
4 a4 a5
入队 假溢出
Q.rear Q.rear Q.front
Q.rear Q.rear
• 初始空队列:front = rear=0 ; • 插入新的元素时, rear++; • 删除队头元素时,front++;
23
数据结构
• Index(S,T,pos) –初始条件: 串S和T存在,T是非空串,1<=pos<=S的长度。 –操作结果: 若主串S中存在和串T相同的子串,则返回它在主 串 S中第pos个字符之后第一次出现的位置;否则返回0。 • Replace(&S,T,V) –初始条件: 字符串S,T,V已经存在,T是非空串。 –操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子 串。 • StrInsert(&S,pos,T) –初始条件: 字符串S,T存在,1<=pos<=S的长度+1。 –操作结果: 在串S的第pos个字符之前插入串T。 • StrDelete(&S,pos,len) –初始条件: 串S存在,1<=pos<=S的长度-len+1。 –操作结果: 从串S中删除第pos个字符起长度为len的子串。 • DestroyString(&S): 把存在的串S销毁。
方法二:设一个标志位用来区别队列是空还是满。
• 初始化队列时:Q.front=Q.rear,标志位为false • 入队后,使Q.front=Q.rear,则置标志位为true • 出队后,将标志位置为false • 当Q.front=Q.rear, 且标志位为true时,队满。 • 当Q.front=Q.rear, 但标志位为false时,队空。
p->data=e; p->next=NULL;Q.rear->next=p; Q.rear=p;
return OK; }
front a 1
a2
an ∧
rear
7
e

rear p 数据结构
Status DeQueue(LinkQueue &Q,QElemType &e) { // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK, 否则返回ERROR if(Q.front==Q.rear) return ERROR; p p=Q.front->next; front a1 ∧ e=p->data; ∧ Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; free(p); return OK; } rear rear
typedef struct { QElemType *base; // 存储空间基地址 int front; // 队头指针 int rear; // 队尾指针 }SqQueue; #define MAXSIZE 100 Status InitQueue(SqQueue &Q) {Q.base=(QElemType*)malloc(sizeof(QElemType)*MAXSIZE ); if(!Q.base) return(OVERFLOW); Q.front = Q.rear = 0; return OK; } // InitQueue int QueueLength(SqQueue Q){ return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; 14 数据结构 }
数据结构
Status DestroyQueue(LinkQueue &Q) { // 销毁队列Q(无论空否均可) while(Q.front){ Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } retutus EnQueue(LinkQueue &Q,QElemType e) { // 插入元素e为Q的新的队尾元素 if(!(p=(QueuePtr)malloc(sizeof(QNode))))//失败 exit(OVERFLOW);
(a1, a2, „„, an)
队头
1
队尾
数据结构
下图是队列的示意图:
出队 队头
a1
队头
a2
a3
队尾
入队
队列的抽象数据定义见书P59
除了栈和队列之外,还有一种限定性数据结构, 它们是双端队列
删除 插入
a0 a1 a2 端1

ai

an-1 端2
插入 删除
双端队列示意图
2
数据结构
3.4.2 链队列—队列的链式表示和实现 队列的链式存储结构简称为链队列,它是限制仅 在表头删除和表尾插入的单链表。显然仅有单链表的 头指针不便于在表尾做插入操作,为此再增加一个尾 指针,指向链表的最后一个结点。
16
数据结构
栈和队列
栈 逻辑结构 ⑴栈的定义 顺 ⑵操作特性 序 栈 ⑶ADT定义
比较
逻辑结构 ⑴队列定义 ⑵操作特性 ⑶ADT定义
队 列 存储结构 链 队 列
存储结构 链
比较

循 环 队 列
比较
⑴基本操作的实现 ⑵时间性能
17
⑴基本操作的实现 ⑵时间性能 数据结构
思考题
E-mail
18
数据结构
• 其他为非空非满。 12
数据结构
方法三:牺牲一个元素空间,来区别队空或队满。
• 入队前,先判Q.rear+1是否等于Q.front, 若是则为队满。 • 而当Q.front=Q.rear时,为队空。 前例:当J5入队后,就认为队已满, 而当J6再要入队时,就拒绝入队。
13
数据结构
循环队列--队列的顺序存储结构实现(1)
3.4 队列 3.4.1 抽象数据类型队列的定义
队列(Queue):一种运算受限的线性表。只允许在表的 一端进行插入,而在另一端进行删除。允许删除的一端 称为队头(front),允许插入的一端称为队尾(rear)。 先进入队列的成员总是先离开队列。故队列亦称先进 先出(First In First Out)的线性表,简称FIFO表。
rear
front
rear
front



Q
front
a1
rear 非空队
a2

an ∧
Q
front ∧ rear 空队 Q
front
a1 ∧
rear 只有一个元素结点
3
头尾指针封装在一起的链队
数据结构
x入队 front y入队
x
^ rear
x
y
^ rear
front x出队
front y出队 ^ x y
如何解决假溢出?
9
数据结构
循环列表---解决数组越界但未占满空间的办法
maxsize-1 0 ...
队列 1
...
Q.rear
Q.front
当Q.rear > Q.front时: Q.rear – Q.front = 队列中元素个数 当Q.rear < Q.front时: Q.rear – Q.front +maxsize = 队列中 元素个数 10 当Q.rear = Q.front时: 队列是’空’或’满’ 数据结构
数据结构
基本操作的功能说明
• StrAssign(&T,chars) –初始条件: chars是字符串常量。 –操作结果: 生成一个其值等于chars的串T。 • StrCopy(&T,S) –初始条件: 字符串S已经存在。 –操作结果: 由串S复制得串T。 • StrEmpty (S) –初始条件: 字符串S已经存在。 –操作结果: 若S为空串,则返回TRUE,否则返回 FALSE。 • StrCompare(S,T) –初始条件: 字符串S和T存在。 –操作结果: 若S>T,则返回值>0;若S=T,则返回值=0; 否则返回值<0。
(a)一般队列
J5 J4 J3
4 3 5 2 0 1
Q.rear
Q.front
Q.front
(b)满队列
J4 Q.front Q.rear
J5
4 3 5 2 0 1
Q.rear J6
4 3 5 2 0 1
J3
J8
J7
(c)空队列
11
数据结构
方法一 :用一个计数变量来记载队列中的元素个数。
• 初始化队列时c:=0; • 当入队时,计数变量+1( c:=c+1 ) • 当出队时,计数变量-1 (c:=c-1) • 当计数变量=maxsize时,队满 • 当计数变量=0时,队空
第四章
4.1
一、串和基本概念

串类型的定义
串是零个或多个字符组成的有限序列。一般记作 S=‘a1a2a3„an’,S 是串名,单引号括起来的字符序列 是串值;ai(1≦i≦n)可以是字母、数字或其它字符;串 中所包含的字符个数称为该串的长度。长度为零的串称 为空串,它不包含任何字符。 通常将仅由一个或多个空格组成的串称为空白串。注 意:空串和空白串的不同,例如“ ”和“”分别表示 长度为1的空白串和长度为0的空串。
相关主题