第3章_栈和队列v2.0[149页]

合集下载

(整理)栈和队列

(整理)栈和队列

第三章栈和队列1.何为栈和队列?简述两者的区别和联系。

栈:是一种只允许在一端进行插入和删除的线性表,它是一种操作受限的线性表。

在表中只允许进行插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。

栈顶元素总是最后入栈的,因而是最先出栈;栈底元素总是最先入栈的,因而也是最后出栈。

因此,栈也被称为“后进先出”的线性表。

队列:队列(queue)是一种只允许在一端进行插入,而在另一端进行删除的线性表,它是一种操作受限的线性表。

在表中只允许进行插入的一端称为队尾(rear),只允许进行删除的一端称为队头(front)。

队头元素总是最先进队列的,也总是最先出队列;队尾元素总是最后进队列,因而也是最后出队列。

因此,队列也被称为“先进先出”表。

区别和联系:从数据结构上看,栈和队列也是线性表,不过是两种特殊的线性表。

栈只允许在表的一端进行插入或删除操作,队列只允许在表的一端进行插入操作、而在另一端进行删除操作。

因而,栈和队列也可以被称作为操作受限的线性表。

2.若依次读入数据元素序列{a,b,c,d}进栈,进栈过程中允许出栈,试写出各种可能的出栈元素序列。

可能的出栈序列:a,b,c,d b,c,d,a b,a,c,d a,b,d,c a,d,c,b a,c,b,d a,c,d,b b,d,c,a b,a,d,c c,d,b,a c,b,d,a c,b,a,d d,c,b,a 等3.试写一个算法,识别依次读入的一个以@为结束符的字符序列是否为形如‘序列1—序列2’模式的字符序列。

其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。

例如,‘a+b&b+a’是属该模式的字符序列,而’1+3&3-1’则不是。

Status Model(){//识别依次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列2’模式的字符序列//序列1和序列2中不包含字符‘&’,序列1是序列2的逆序列InitStack(s); c=getchar();while (c!='&') {Push(s,c); c=getchar();}c=getchar();while (c!='@'&&!StackEmpty(s)) {Pop(s,x);if (c==x) c=getchar();else return FALSE;}if (c=='@' && StackEmpty(s)) return TRUE;else return FALSE;}4.试写一个判别表达式中开、闭括号是否配对出现的算法。

第3章_栈和队列

第3章_栈和队列
第三章 栈和队列
(Chapter 3. பைடு நூலகம்tack and Queue)
栈的概念、存储结构及其基本操作
栈的应用举例 队列的概念、存储结构及其基本操作
§3.1 栈
3.1.1 栈的定义及基本运算
• 定义:只能在表尾(栈顶)进行插入和删除操 作进行的线性表。 • 特点: 后进先出(LIFO—Last In First Out )
top 栈顶
an an-1
. . .
a1 ∧
栈底
空栈: top == NULL
16

入栈
LinkStack Push_LS (LinkStack top,datatype x) { StackNode *p ; top p = (StackNode *) malloc (sizeof( StackNode)); p->data = x; top p->next = top; top = p; return top; }
23
2
括号匹配的检验:
问题:两种括号,可以嵌套使用,但不能重叠 解决:使用栈。 {([ ][ ])} 左括号进栈, 右括号就从栈顶出栈一个左括号, 检查是否能够匹配。 算法开始和结束时,栈都应该是空的。
匹配一个字符串中的左、右括号。如
[ a * ( b + c ) + d ]
( 出栈
( )匹配
[ 出栈
3.1.2 栈的存储及运算实现

顺序栈 -- 栈的顺序存储表示 链栈 -- 栈的链式存储表示

4
1 顺序栈
顺序栈类型的定义 – 本质 顺序表的简化,唯一需要确定的是栈顶、栈底。 – 通常 栈底:下标为0的一端 栈顶:由top指示,空栈时top=-1

数据结构第三章 数据结构堆栈和队列

数据结构第三章 数据结构堆栈和队列

数据结构第三章数据结构堆栈和队列在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地访问和操作这些数据。

在数据结构的众多类型中,堆栈和队列是两种非常重要且常用的结构。

首先,让我们来了解一下堆栈。

堆栈就像是一个垂直堆放的容器,遵循着“后进先出”(Last In First Out,简称LIFO)的原则。

想象一下,你有一堆盘子,每次你把新盘子放在最上面,而当你要取盘子时,也只能从最上面拿。

这就是堆栈的工作方式。

在编程中,堆栈有着广泛的应用。

比如,函数调用就是一个典型的例子。

当一个函数调用另一个函数时,新函数的信息被压入堆栈。

当被调用的函数执行完毕后,其信息从堆栈中弹出,程序回到原来的函数继续执行。

此外,表达式求值也常常会用到堆栈。

例如,计算一个复杂的算术表达式时,可以将操作数和运算符依次压入堆栈,然后按照特定的规则进行计算。

堆栈的实现可以通过数组或者链表来完成。

如果使用数组实现,需要注意堆栈的大小可能会有限制。

而链表实现则相对灵活,但其操作的复杂度可能会略高一些。

接下来,我们再看看队列。

队列则像是一条排队的队伍,遵循“先进先出”(First In First Out,简称 FIFO)的原则。

就好比在银行排队办理业务,先来的人先得到服务并离开队伍。

在实际应用中,队列也非常有用。

例如,打印机的打印任务队列就是一个典型的例子。

新的打印任务被添加到队列的末尾,而打印机按照任务进入队列的顺序依次处理。

还有操作系统中的任务调度,也常常会用到队列来管理等待执行的任务。

队列同样可以通过数组或者链表来实现。

使用数组实现时,可能会面临队列前端元素删除后空间浪费的问题。

而链表实现虽然可以避免这个问题,但需要额外的指针操作。

那么,堆栈和队列在操作上有哪些不同呢?对于堆栈,主要的操作是入栈(push)和出栈(pop)。

入栈就是将元素添加到堆栈的顶部,出栈则是从堆栈的顶部取出元素。

而对于队列,主要的操作是入队(enqueue)和出队(dequeue)。

第3章-栈和队列

第3章-栈和队列

1. 如果栈满,则抛出上溢异常; 2. 判断是插在栈1还是栈2;
2.1 若在栈1插入,则 2.1.1 top1加1; 2.1.2 在top1处填入x;
2.2 若在栈2插入,则 2.2.1 top2减1; 2.2.2 在top2处填入x;
清华大学出版社
3.1 栈
数据结构(C++版)第2版
两栈共享空间的实现——删除 操作接口:DataType Pop(int i) ;
清华大学出版社
3.1 栈
两栈共享空间
0 1 2 ……
a1 a2 … … ai bj

数据结构(C++版)第2版
S-1
… b2 b1
top1 top2 什么时候栈1为空? 什么时候栈2为空? 什么时候栈满?
top1= -1 top2= Stack_Size top2= top1+1
清华大学出版社
3.1 栈
时间复杂度?
清华大学出版社
3.1 栈
数据结构(C++版)第2版
两栈共享空间
在一个程序中需要同时使用具有相同数据类型的 两个栈,如何顺序存储这两个栈?
解决方案1: 直接解决:为每个栈开辟一个数组空间。
会出现什么问题?如何解决? 解决方案2: 顺序栈单向延伸——使用一个数组来存储两个栈
清华大学出版社
➢ 情况2:
出栈序列:b
栈顶
栈顶
c
栈底
a
出栈序列:b、c 出栈序列: b、 c、a
清华大学出版社
3.1 栈
数据结构(C++版)第2版
栈的逻辑结构
例:有三个元素按a、b、c的次序依次进栈,且每个 元素只允许进一次栈,则可能的出栈序列有多少种?

第03章栈和队列

第03章栈和队列

1.链栈定义
栈的链接存储结构称为链栈 。
top
an

栈 示
an-1


栈顶
链栈是否也需要 加一个头结点?
a1 ∧ 栈底
2020年3月1日星期日
算法与数据结构第三章栈和队列
26
第3章 特殊线性表——栈
链栈示意图
2020年3月1日星期日
算法与数据结构第三章栈和队列
27
第3章 特殊线性表——栈
链栈中数据结点的类型LiStack定义如下:
2020年3月1日星期日
算法与数据结构第三章栈和队列
7
第3章 特殊线性表——栈
例3.3 已知一个栈的进栈序列是1,2,3,…,n,其输出序 列是p1,p2,…,pn,若p1=n,则pi的值 。
(A) i
(B) n-i
(C) n-i+1
(D) 不确定
答:当p1=n时,输出序列必是n,n-1,…,3,2,1,则有:
在栈不满的条件下,先将栈指针增1,然后在该位置 上插入元素e。对应算法如下:
int Push(SqStack *&s,ElemType e) { if (s->top==MaxSize-1) return 0;
/*栈满的情况,即栈上溢出*/ s->top++; s->data[s->top]=e; return 1; }
29
第3章 特殊线性表——栈
(2) 销毁栈ClearStack(&s) 释放栈s占用的全部存储空间。对应算法如下:
/*栈为空的情况,即栈下溢出*/ e=s->data[s->top]; s->top--; return 1; }

第三章栈和队列

第三章栈和队列





*

/



=



#

=
2019/9/4
26
例如: #4+ 2 3 10 / 5 #
+

+
2
#
4
OPTR OPND
2019/9/4
27
算符间的优先级关系
1 2 +

*
/ () #
+


}
例2 Hanoi 塔问题
a
2019/9/4
b
c
40
例2 Hanoi 塔问题
a
2019/9/4
b
c
41
例2 Hanoi 塔问题
a
2019/9/4
b
c
42
例2 Hanoi 塔问题
a
2019/9/4
b
c
43
void hanoi (int n, char x, char y, char z) {
3
2
2019/9/4
栈顶
1
9
Top
2. 栈的压入操作
Push(&S, e) //栈 S 已存在,压入元素 e
{ if (s.top== Maxsize -1)
printf("栈满溢出");
else
{ S.top++;
4
S.ST[top]=e;
}
3
return OK;
2
}
1
2019/9/4
Top
10
/

数据结构课件第3篇章栈和队列

数据结构课件第3篇章栈和队列

循环队列实现原理
01
循环队列定义
将一维数组看作首尾相接的环形结构,通过两个指针(队头和队尾指针)
在数组中循环移动来实现队列的操作。当队尾指针到达数组末端时,再
回到数组起始位置,形成循环。
02
判空与判满条件
在循环队列中,设置一个标志位来区分队列为空还是已满。当队头指针
等于队尾指针时,认为队列为空;当队尾指针加1等于队头指针时,认
栈在函数调用中应用
函数调用栈
在程序执行过程中,每当发生函数调用时,系统会将当前函数的执行上下文压入一个专门的栈中,称为函数调用 栈。该栈用于保存函数的局部变量、返回地址等信息。当函数执行完毕后,系统会从函数调用栈中弹出相应的执 行上下文,并恢复上一个函数的执行状态。
递归调用实现
递归调用是一种特殊的函数调用方式,它通过在函数调用栈中反复压入和弹出同一函数的执行上下文来实现对问 题的分解和求解。在递归调用过程中,系统会根据递归深度动态地分配和管理函数调用栈的空间资源。
栈和队列的应用
栈和队列在计算机科学中有着广泛的应用,如函数调用栈、表达式求 值、缓冲区管理等。
常见误区澄清说明
误区一
栈和队列的混淆。虽然栈和队列都是线性数据结构,但它们的操作方式和应用场景是不同的。栈是后进先出,而队列 是先进先出。
误区二
认为栈和队列只能通过数组实现。实际上,栈和队列可以通过多种数据结构实现,如链表、循环数组等。具体实现方 式取决于应用场景和需求。
后缀表达式求值
利用栈可以方便地实现后缀表达式的求值。具体步骤 为:从左到右扫描表达式,遇到数字则入栈,遇到运 算符则从栈中弹出所需的操作数进行计算,并将结果 入栈,最终栈中剩下的元素即为表达式的结果。
中缀表达式转换为后缀表达式

第三章栈和队列

第三章栈和队列

◆ 结点出栈:首先执行top减1,使top指向栈顶元 素的存储位置,然后将栈顶元素取出。
top top bottom
top
空栈 bottom 元素a进栈 top
a
bottom 元素b,c进栈
f e d b a
c b a
top bottom 元素c退栈
b a
bottom 元素d,e,f进栈
图3-2 (动态)堆栈变化示意图
循环队列的基本操作
1 循环队列的初始化
void Init_CirQueue (SqQueue *q)
{
q->front=q->rear=0;
}
2 入队操作
Status Insert_CirQueue(SqQueue *q , ElemType e)
/* 将数据元素e插入到循环队列Q的队尾 */
{ if ((q->rear+1)%MaxSize== q->front)
对于队列,和顺序栈相类似,也有动态和静态之分。 本部分介绍的是静态顺序队列,其类型定义如下:
#define MAX_QUEUE_SIZE 100
typedef struct queue { ElemType Queue_array[MAX_QUEUE_SIZE] ; int front ; int rearue{ 数据对象:D ={ ai|ai∈ElemSet, i=1, 2, …, n, n >= 0 }
数据关系:R = {<ai-1, ai> | ai-1, ai∈D, i=2,3,…,n } 约定a1端为队首,an端为队尾。 基本操作:
Create():创建一个空队列;
return ERROR;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档