(数据结构课件)栈

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
栈是一种特殊的线性表,因此栈可采用顺序存 储结构存储,也可以使用链式存储结构存储。
4.2 栈的顺序存储结构和操作实现
1.顺序栈的数组表示
与第二章讨论的顺序表一样,利用一块连续内存 空间依次存放自栈底到栈顶的数据元素,这种形式的 栈称为顺序栈。
因此,我们可以用一维数组来作为栈的顺序存储 空间。设指针top指向栈顶元素的当前位置。对数组 而言,这个top指针就是一个整型变量,即栈顶元素 所对应的数组下标。
指针减1。
4.3 栈的链式存储结构和操作实现
1.链栈的表示
栈也可以采用链式存储结构(即单链表)表示, 这种结构的栈简称为链栈。在一个链栈中,栈底就 是链表的最后一个结点,而栈顶总是链表的第一个 结点。
因此,栈顶指针即为单链表的表头指针,指针 方向从栈顶往下链接,直到链表的最后一个结点( 即栈底)。
链栈的存储结构图 (a)含有两个元素A、B的栈;
(b)插入元素C后的栈; (c)删除元素C、B后的栈
2. 链栈的操作实现
(1)初始化栈 函数名:InitStack 形参:链栈HS 返回值:无 功能:置栈为空,即令HS=NULL
(2)清空栈 函数名:ClearStack 形参:链栈HS 返回值:无 功能:从栈顶开始,依次删除各结点,并回收每
要求实现的功能: 1.病人到达,交病历卡,取号入队 2.叫到号时,取出病历,患者就诊 3.不接受新病人,已排队病人依次就诊
以上三种情况用输入命令来模拟: 命令“A”:病人到达 命令“N”:护士让下一位病人就诊 命令“Q”:剩余病人依次就诊,然后结束
4.1.1 栈的定义及其运算
下图是一个栈的示意图,通常用指针top指示栈顶的 位置,栈顶指针top动态反映栈顶的当前位置。
2. 栈顶指针top:是一个整型变量,用于指示栈顶的 位置。top=-1时顺序栈空;top=MaxSize-1时顺序 栈满。进栈操作时,top加1,出栈操作时top减1。
2. 顺序栈的操作实现
(1)初始化栈 函数名:InitStack 形参:顺序栈S 返回值:无 功能:置栈为空,即令top=-1
(2)清空栈 函数名:ClearStack 形参:顺序栈S 返回值:无 功能:对静态顺序栈而言,此算法与初始化栈完
以数组小下标的一端作为栈底。由于C语言中数 组下标从0开始,因此用一维数组作为栈时,应设栈 顶指针top= -1时为空栈。在元素进栈时指针top不断 地加1,当top等于数组的最大下标值时则栈满。
下图展示了顺序栈中数据元素与栈顶指针的变化。
top=-1
(a)
top=4
E D
C
top=0
B
A
A
(b)
个结点所占的空间。最后置栈为空。
全相同,即置栈为空。
2. 顺序栈的操作实现
(3)判别栈空 函数名:EmptyStack 形参:顺序栈S 返回值:若栈空返回true,否则返回false 功能:判断栈是否为空,即判断top是否为-1
(4)读取栈顶元素 函数名:Peek 形参:顺序栈S 返回值:栈顶元素的值 功能:若栈非空,则返回栈顶元素的值,即数组
stack中,下标为top的元素的值。
2. 顺序栈的操作实现
(5)元素进栈 函数名:Push 形参:顺序栈S,待进栈元素item 返回值:无 功能:若栈未满,先令栈顶指针加1,然后赋item
的值到新的栈顶。
(6)元素出栈 函数名:Pop 形参:顺序栈S 返回值:栈顶元素 功能:若栈未空,先取出栈顶元素,然后令栈顶
ElemType data; SNode *next; };
我们知道,一个单链表可由表头指针HL来表
示。同样地,一个链栈也可由栈顶指针HS(相当
于前面讲的top)来表示,当HS为NULL时,是
一个空栈。下图给出了链栈中数据元素与栈顶指
针HS的关系。
HS
C
HS
B
A∧
B A∧
HS
A∧
(a)
(b)
(c)
插入元素时,新入栈的元素即为链表新的表头 结点,只要系统还有存储空间,就不会有栈满的情 况发生。删除元素时,也即删除链表的表头结点。
因此,对链栈的插入和删除都是在单链表的表 头进行,时间复杂度均为O(1)。
链栈中结点的C语言(或C++)定义与单链表中 结点的定义相同,即为:
struct SNode {
(c)
栈的存储结构
top=2
C B A
(d)
(a)空栈;(b)插入元素A后; (c)插入元素B、C、D、E后;
(d)删除元素E、D后
用C或C++定义的顺序栈如下:
struct Stack { ElemType stack[MaxSize]; int top;
};
包括两个成员:
1. 数组:用于存储栈中元素。数组的大小决定了栈 的最大深度。
12 3 4
栈算 栈 队 术与列 表递 达归 式 的 计 算
第四章 栈和队列
从数据结构上看,栈和队列 也是线性表,不过是两种特殊的 线性表。
栈只允许在表的一端进行插 入或删除操作,而队列只允许在 表的一端进行插入操作、而在另 一端进行删除操作。因而,栈和 队列也可以被称作为操作受限的 线性表。
通过本章的学习,应掌握栈 和队列的逻辑结构和存储结构, 以及栈和队列的基本运算以及实 现算法。
ຫໍສະໝຸດ Baidu入栈
出栈
栈顶 top
an-1
.. .
a1 a0
栈的示意图
2.栈的基本运算
(1)InitStack(s) 初始化:初始化一个新的栈s,即 置为空。 (2)ClearStack(s) 清空栈:清除栈中所有元素, 并置栈s为空栈。 (3)EmptyStack (s) 栈的空判断:若栈s为空,则 返回true;否则,返回false。 (4)Peek(s) 返回栈顶元素:若栈s不空,则返回栈 顶元素。但不删除栈顶元素,故栈顶指针不移动。 (5)Push(s,x) 进栈:在栈s的顶部插入元素x。 (6)Pop(s) 出栈:若栈s不空,则返回栈顶元素, 并从栈顶中删除该元素。
编程任务 —— 简单编译器 (括号配对检查)
问题描述: 在程序调试时都有对源代码编译的过程
,而判断左右括号是否匹配也是其中的一个重 要环节。设计程序对任意输入的表达式进行检 查,判断左右括号是否配对。
基本要求: 利用栈来实现算法。以圆括号为例来判
断输入的表达式中左右括号是否匹配。
编程任务 —— 排队看病系统
相关文档
最新文档