3-数据结构-清华大学严蔚敏PPT-栈和队列

合集下载

数据结构(严蔚敏)精第3章PPT课件

数据结构(严蔚敏)精第3章PPT课件

ppt精选版
10
二、栈的主要操作 1.初始化栈:InitStack(&S)
将栈S置为一个空栈(不含任何元素)。
2.进栈:PUSH(&S,X)
将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压 入”。
3.出栈: POP(&S,&e)
删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹出”。
或简单定义如下:
#define M 100 int s[M]; int top;
ppt精选版
16
图3.2 顺序栈中的进栈和出栈
Top指向栈顶元素 初态:top=-1; 空栈,栈中无元素, 进栈:top=top+1; s[top]=x; 退栈:取s[top]; top=top-1; 栈满:top=M-1;栈溢出(上溢),不能再进栈(错误状 态) top=-1时不能退栈,下溢(ppt精正选版常状态,常作控制条件17)
ppt精选版
两种存储结构中的实现都不难,但应该对它
们了如指掌,特别要注意它们的基本操作实
现时的一些特殊情况,如栈满和栈空、队满
和队空的条件以及它们的描述方法。本章要
求必须完成的算法设计题为:3.15,3.17,
3.19,3.22, 3.27 ,3.28,3.30,3.31,3.32。
其中前4个主要是练习栈的应用,后4个主要
插入:最先放入栈中元素在栈底,最后放入的元素在栈顶; 删除:最后放入的元素最先删除,最先放入的元素最后删除。 栈是一种后进先出(Last In First Out)的线性表,简称为LIFO 表。
ppt精选版
8
出栈 栈顶
an
进栈
出栈
进栈

数据结构(c语言版)_严蔚敏版_第3章_栈和队列_信大(第3讲)

数据结构(c语言版)_严蔚敏版_第3章_栈和队列_信大(第3讲)

3.2.1 栈的顺序存储结构及实现 两栈共享空间
0 1 2 ……
S-1
a1 a 2 … ai
top1
top1
bj … … b2 b1
top2 top1= -1
什么时候栈1为空?
3.2.1 栈的顺序存储结构及实现 两栈共享空间
0 1 2 ……
S-1
a 1 a2 … ai
top1
什么时候栈1为空? 什么时候栈2为空?

栈的顺序存储结构简称为顺序栈,它是运算受限 的线性表。因此,可用数组来实现顺序栈。因为栈底 位置是固定不变的,所以可以将栈底位置设置在数组 的两端的任何一个端点;栈顶位置是随着进栈和退栈 操作而变化的,故需用一个整型变量top
定义:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元 素,同时附设指针top指示栈顶元素在顺序栈中的位置。
(4)取栈顶元素操作 取出栈顶元素:先判断栈是否为空,不为 空,则将栈顶元素值取出。 出栈和取栈顶值是不同的。
3.2.1 栈的顺序存储结构及实现 (5)判栈空操作
看栈顶和栈底是否相等。 (6)置空操作 栈顶和栈底相等
3.2.1 栈的顺序存储结构及实现 两栈共享空间
在一个程序中需要同时使用具有相同数据类型的 两个栈,如何顺序存储这两个栈? 解决方案1:
3.2.2 栈的链式存储结构及实现
链栈:栈的链接存储结构 如何改造链表实现栈的链接存储?
head
a1
a2
an
将哪一端作为栈顶? 将链头作为栈顶,方便操作。 链栈需要加头结点吗? 链栈不需要附设头结点。
栈的链式存储结构称为链栈,它是运算是受限的单链表,插入和删除操作仅限制在表 头位置上进行.由于只能在链表头部进行操作,故链表没有必要像单链表那样附加头 结点。栈顶指针就是链表的头指针。

清华大学严蔚敏数据结构ppt课件

清华大学严蔚敏数据结构ppt课件

数据结构的形式定义为:数据结构是一个二元 组:
Data-Structure=(D,S)
其中:D是数据元素的有限集,S是D上关系的 有限集。
例 复数的数据结构定义如下:
Complex=(C,R)
其中:C是含两个实数的集合﹛C1,C2﹜,分 别表示复数的实部和虚部。R={P},P是定义在 集合上的一种关系{〈C1,C2〉}。
当n取得很大时,指数时间算法和多项 式时间算法在所需时间上非常悬殊。因
此,只要有人能将现有指数时间算法中
的任何一个算法化简为多项式时间算法, 那就取得了一个伟大的成就。
有的情况下,算法中基本操作重复执行的次数 还随问题的输入数据集不同而不同。例如:
Void bubble-sort(int a[],int n)
(1)有穷性 一个算法必须总是在执行有穷步 之后结束,且每一步都在有穷时间内完成。
(2)确定性 算法中每一条指令必须有确切的 含义。不存在二义性。且算法只有一个入口和 一个出口。
(3)可行性 一个算法是可行的。即算法描述 的操作都是可以通过已经实现的基本运算执行 有限次来实现的。
4)输入 一个算法有零个或多个输入,这些输 入取自于某个特定的对象集合。
对一个算法要作出全面的分析可分成两用人 才个阶段进行,即事先分析和事后测试
事先分析 求出该算法的一个时间界限函数
事后测试 收集此算法的执行时间和实际占用 空间的统计资料。
定义:如果存在两个正常数c和n0,对于所有的 n≧n0,有︱f(n) ︳≦c|g(n) ︳
则记作 f(n)=O(g(n))
姓名 王小林 陈红 刘建平 张立立 ……..
学号 790631 790632 790633 790634 ……..

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

严蔚敏数据结构(栈和队列)

严蔚敏数据结构(栈和队列)

main() { int m; printf("Input number of disks”); scanf("%d",&m); printf(”Steps : %3d disks”,m); hanoi(m,'A','B','C'); (0) } void hanoi(int n,char x,char y,char z) (1) { (2) if(n==1) (3) move(1,x,z); (4) else{ (5) hanoi(n-1,x,z,y); (6) move(n,x,z); (7) hanoi(n-1,y,x,z); (8) } (9) }
第三章 栈和队列
栈和队列是两种特殊的线性表,是操作受限的线性 表,称限定性DS
§3.1 栈(stack)
栈的定义和特点
定义:限定仅在表尾进行插入或删除操作的线性表, 表尾—栈顶,表头—栈底,不含元素的空表称空栈 特点:先进后出(FILO)或后进先出(LIFO)
进栈 出栈
...
栈顶
an ……... a2
2 1 0
1 top 0 base
栈顶指针top,指向实际栈顶 后的空位置
栈空:top=base, 此时出栈,则下溢(underflow) 栈满:top-base>=stacksize, ,此时入栈, 则上溢(overflow)
顺序存储栈的结点类型的定义: #define STACK_INIT_SIZE 100; #define STACKINCREMENT 10; typedef struct { ElemType *base,*top; int stacksize; }sqStack;

严蔚敏数据结构课件chap3(2)

严蔚敏数据结构课件chap3(2)

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; }
1 2 3 返址 n
5 7 5 8
a z
一、 抽象数据类型队列的定义 链队列---队列的链式表示 二、 链队列 队列的链式表示 和实现 循环队列---队列的顺序表 三、 循环队列 队列的顺序表 示和实现
队列的类型定义
ADT Queue { 数据对象: 数据对象: D={ai | ai∈ElemSet, i=1,2,...,n, n≥0} 数据关系: 数据关系: R1={ <a i-1,ai > | ai-1, ai ∈D, i=2,...,n} 约定其中a1 端为队列头 an 端为队列尾 队列头, 队列头 队列尾 基本操作: 基本操作: } ADT Queue
队列的基本操作: 队列的基本操作:
InitQueue(&Q) QueueEmpty(Q) GetHead(Q, &e) EnQueue(&Q, e) DestroyQueue(&Q) QueueLength(Q) ClearQueue(&Q) DeQueue(&Q, &e)
QueueTravers(Q, visit())

}// a
递归函数执行的过程可视为同一函数 同一函数 进行嵌套调用,例如:
递归工作栈: 递归工作栈:递归过程执行过程中占用的

chap003 栈和队列-数据结构(C语言版)-严蔚敏-清华大学出版社

chap003 栈和队列-数据结构(C语言版)-严蔚敏-清华大学出版社
} if (StackEmpty(S)&&state) return OK; …...
例三、行编辑程序问题
如何实现?
“每接受一个字符即存入存储器” ?
并不恰当!
在用户输入一行的过程中,允许 用户输入出差错,并在发现有误时 可以及时更正。 合理的作法是:
设立一个输入缓冲区,用以接受 用户输入的一行字符,然后逐行存 入用户数据区,并假设“#”为退格 符,“@”为退行符。
GetTop(S, &e) 初始条件:栈 S 已存在且非空。 操作结果:用 e 返回 S 的栈顶
元素。
a1 a2 … … an
ClearStack(&S) 初始条件:栈 S 已存在。 操作结果:将 S 清为空栈。
Push(&S, e) 初始条件:栈 S 已存在。 操作结果:插入元素 e 为新
的栈顶元素。
分析可能出现的不匹配的情况:
• 到来的右括弧并非是所“期待” • 的到;来的是“不速之客”;
• 直到结束,也没有到来所“期待” 的括弧。
算法的设计思想:
1)凡出现左括弧,则进栈;
2)凡出现右括弧,首先检查栈是否空 若栈空,则表明该“右括弧”多余, 否则和栈顶元素比较, 若相匹配,则“左括弧出栈” , 否则表明不匹配。
} // conversion
例二、 括号匹配的检验 假设在表达式中 ([]())或[([ ][ ])] 等为正确的格式, [( ])或([( ))或 (()]) 均为不正确的格式。
则 检验括号是否匹配的方法可用 “期待的急迫程度”这个概念来描述。
例如:考虑下列括号序列: [( [ ][ ] )] 1 2 34 5 6 7 8
switch (ch) {

数据结构严蔚敏PPT(完整版)

数据结构严蔚敏PPT(完整版)
排序算法的时间复杂度
时间复杂度是衡量算法效率的重要指标,常见的 排序算法的时间复杂度有O(n^2)、O(nlogn)、 O(n)等。
查找的基本概念和算法
查找的基本概念
查找是指在一个已经有序或部分 有序的数据集合中,找到一个特 定的元素或一组元素的过程。
常见查找算法
常见的查找算法包括顺序查找 、二分查找、哈希查找等。
先进先出(FIFO)的数据 处理。
并行计算中的任务调度。
打印机的打印任务管理。
二叉树的层序遍历(宽度 优先搜索,BFS)。
04
树和图
树的基本概念和性质
树的基本概念
树是一种非线性数据结构,由节 点和边组成,其中节点表示实体 ,边表示实体之间的关系。
树的性质
树具有层次结构,节点按照层次 进行排列,每个节点最多只能有 一个父节点,除了根节点外。
isEmpty:判断队列是否为空。
enqueue:向队尾添加一个元素。
front 或 peek:查看队首元素。
dequeue:删除队首的元素。
栈和队列的应用
栈的应用 后进先出(LIFO)的数据处理。
括号匹配问题。
栈和队列的应用
队列的应用
深度优先搜索(DFS)。 表达式求值。
01
03 02
栈和队列的应用
数据结构严蔚敏ppt( 完整版)
contents
目录
• 绪论 • 线性表 • 栈和队列 • 树和图 • 排序和查找 • 数据结构的应用案例分析
01
绪论
数据结构的基本概念
总结词
数据结构是计算机存储和组织数据的方式,是算法和数据操 作的基础。
详细描述
数据结构是计算机科学中研究数据的组织和存储方式的学科 ,它决定了数据在计算机中的表示和关系。数据结构不仅包 括数据的逻辑结构,还涉及到数据的物理存储方式以及数据 的操作方式。

数据结构-清华大学严蔚敏PPT

数据结构-清华大学严蔚敏PPT
③ 可行性: 一个算法是能行的。即算法描述的操作 都可以通过已经实现的基本运算执行有限次来实现。
④ 输入: 一个算法有零个或多个输入,这些输入 取自于某个特定的对象集合。
⑤ 输出: 一个算法有一个或多个输出,这些输出 是同输入有着某些特定关系的量。
一个算法可以用多种方法描述,主要有:使用自 然语言描述;使用形式语言描述;使用计算机程序设计 语言描述。
初始化赋值查找修改插入删除求长度等初始化赋值查找修改插入删除求长度等以下将对几种主要的操作进行讨论以下将对几种主要的操作进行讨论statusinitsqlistsqliststatusinitsqlistsqlistlelemarrayelemtypelelemarrayelemtypemallocmaxsizesizeofelemtypemallocmaxsizesizeofelemtypereturnerrorreturnerrorreturnokreturnok在线性表在线性表i1i1i1i1个位置上插入一个新结点个位置上插入一个新结点使其成使其成为线性表为线性表i1i1i1i1将线性表将线性表个结点后移一个位个结点后移一个位将结点将结点插入到结点插入到结点i1i1之后之后线性表长度加线性表长度加算法描述算法描述statusinsertsqlistsqliststatusinsertsqlistsqlistelemtypeelemtypei0illength1returnerrori0illength1returnerror线性表溢出线性表溢出returnerrorlelemarrayj1lelemarrayj
算法与数据结构
教材:《数据结构 (C 语言版 ) 》。严蔚敏,吴伟民

著。清华大学出版社。
参考文献:
1 《数据结构》 。张选平,雷咏梅 编, 严蔚敏 审。 机械工业出版社。

数据结构 C语言版(严蔚敏版)第3章 栈和队列

数据结构 C语言版(严蔚敏版)第3章 栈和队列

if (S.top == S.base) return FALSE; --S.top; // 栈顶指针前移 e = *S.top; // 返回非空栈中栈顶元

return TRUE; }
4. {
获取栈顶元素内容
bool GetTop (Stack S, ElemType &e)
// 若栈不空,则用 e 返回S的栈顶元素,并返回TRUE;否 则返回FALSE
第3章 栈和队列
栈和队列是两种特殊的线性表,它们是运算 时要受到某些限制的线性表,故也称为限定性的 数据结构。
3.1 栈
3.1.1栈的定义
栈:限定只能在表的一端进行插入和删除的特殊的线性表 设栈s=(a1,a2,. . . ,ai,. . . ,an), 其中a1是栈底元素, an是栈顶元素。 进栈 出栈 an „. a2
10
65
865
第3章 栈和队列
学习提要
1.掌握栈和队列这两种抽象数据类型的特点, 并能在相应的应用问题中正确选用它们。 2. 熟练掌握栈类型的两种实现方法,即两种 存储结构表示时的基本操作实现算法,特别应 注意栈满和栈空的条件以及它们的描述方法。
3. 熟练掌握循环队列和链队列的基本操作实 现算法,特别注意队满和队空的描述方法。
4.
获取栈顶元素内容
void GetTop(STACK S,StackEntry *item)
{
if (StackEmpty(S)) exit(“Stack is empty”); else *item=S.top->item; }
5. {
判断栈S是否空
int StackEmpty(STACK S) if (S.top==NULL) return TRUE;

(2024年)数据结构严蔚敏PPT完整版

(2024年)数据结构严蔚敏PPT完整版

选择排序的基本思想
在未排序序列中找到最小(或最大)元素,存放到排序 序列的起始位置,然后,再从剩余未排序元素中继续寻 找最小(或最大)元素,然后放到已排序序列的末尾。 以此类推,直到所有元素均排序完毕。
2024/3/26
33
交换排序和归并排序
交换排序的基本思想
通过不断地交换相邻的两个元素(如果它们的顺序错 误)来把最小的元素“浮”到数列的一端。具体实现 时,从第一个元素开始,比较相邻的两个元素,如果 前一个比后一个大,则交换它们的位置;每一对相邻 元素做同样的工作,从开始第一对到结尾的最后一对 ;这步做完后,最后的元素会是最大的数;针对所有 的元素重复以上的步骤,除了最后一个;持续每次对 越来越少的元素重复上面的步骤,直到没有任何一对 数字需要比较。
图的基本操作
创建图、添加顶点、添加边、删除顶点、删除边 等
2024/3/26
27
图的存储结构
01
邻接矩阵表示法
用一个二维数组表示图中顶点间的 关系,适用于稠密图
十字链表表示法
用于有向图,可以方便地找到任一 顶点的入边和出边
03
2024/3/26
02
邻接表表示法
用链表表示图中顶点间的关系,适 用于稀疏图
入栈操作将元素添加到栈顶,出栈操作将栈顶元素删 除,取栈顶元素操作返回栈顶元素但不删除,判断栈
是否为空操作检查栈中是否有元素。
2024/3/26
12
栈的表示和实现
栈可以用数组或链表来实现。
用数组实现时,需要预先分配一块连续的内存空间,用一个变量指示栈顶位置。入栈和出栈操作都可以 通过移动栈顶位置来实现。
22
二叉树的定义和基本操作
二叉树的定义
二叉树是一种特殊的树,每个节点最 多有两个子节点,分别称为左子节点 和右子节点。

《数据结构严蔚敏》课件

《数据结构严蔚敏》课件

哈希查找
哈希查找利用哈希函数将关 键字映射为存储位置进行查 找。
排序算法
排序算法用于对数据进行升序或降序排列。源自冒泡排序、快速排序和堆排序
冒泡排序通过相邻元素交换进行排序,快速排 序使用分治思想,堆排序利用堆的性质进行排 序。
高级数据结构
B-树和B+树
B-树和B+树是一种多路搜索树,用于处理大量数据。
算法性能的重要指标。
稳定排序算法会保持相同元素的相对位
置不变。
3
贪心算法、动态规划算法等
贪心算法和动态规划算法是解决优化问 题的常用方法。
图的遍历算法
图的遍历有广度优先搜索和深度优先搜索两种 常用算法。
图的存储结构
图的存储结构包括邻接矩阵和邻接表等多种方 式。
最短路径算法
最短路径算法用于求解图中两个顶点之间的最 短路径。
查找与排序
查找算法
查找算法用于在数据结构中 查找指定元素的位置。
顺序查找和二分查找
顺序查找是逐个比较查找, 二分查找利用有序性进行折 半查找。
树结构
1
树的定义
树是一种非线性结构,具有层次关系的
二叉树
2
数据结构。
二叉树是一种特殊的树结构,每个节点
最多有两个子节点。
3
遍历算法
二叉树的遍历有前序、中序和后序三种
线索二叉树
4
常用算法。
线索二叉树是一种利用空指针存储前驱 和后继结点的二叉树。
图结构
图的定义
图是由顶点和边组成的非线性结构,用于描述 事物之间的关系。
数据结构的基本概念
数据结构包括元素、关系和操作等基本概念。
线性结构
线性表的定义
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2 栈的初始化
SqStack Init_Stack(void)
{
}
SqStack S ;
S.bottom=S.top=0 ; return(S) ;
3 压栈(元素进栈)
Status push(SqStack S , ElemType e)
/* 使数据元素e进栈成为新的栈顶 */
{ if (S.top==MAX_STACK_SIZE-1)
例如 (1348)10= (2504)8,其运算过程如下:
n n div 8 n mod 8
1348
168 21 2
168
21 2 0
4
0 5 2
采用静态顺序栈方式实现 void conversion(int n , int d)
/*将十进制整数N转换为d(2或8)进制数*/
{ SqStack S ;
top->next=NULL ;
return(top) ; }
(2) 压栈(元素进栈)
Status push(Stack_Node *top , ElemType e) { Stack_Node *p ;
p=(Stack_Node *)malloc(sizeof(Stack_Node)) ;
if (!p) return ERROR;
3.2.2
括号匹配问题
在文字处理软件或编译程序设计时,常常需要检 查一个字符串或一个表达式中的括号是否相匹配?
匹配思想:从左至右扫描一个字符串(或表达式),则
每个右括号将与最近遇到的那个左括号相匹配。则可以 在从左至右扫描过程中把所遇到的左括号存放到堆栈中。 每当遇到一个右括号时,就将它与栈顶的左括号(如果 存在)相匹配,同时从栈顶删除该左括号。
3.1 栈
3.1.1 栈的基本概念
1 栈的概念
栈(Stack):是限制在表的一端进行插入和删除
操作的线性表。又称为后进先出LIFO (Last In First Out)或先进后出FILO (First In Last Out) 线性表。
栈顶(Top):允许进行插入、删除操作的一端,
又称为表尾。用栈顶指针(top)来指示栈顶元素。
栈底(Bottom):是固定端,又称为表头。
空栈:当表中没有元素时称为空栈。
设栈S=(a1,a2,…an),则 a1称为栈底元素,an为栈顶元素, 如图3-1所示。
进栈(push)
出栈(pop)
top
栈中元素按a1,a2,…an的次 序进栈,退栈的第一个元素应为栈顶 元素。即栈的修改是按后进先出的原 bottom 则进行的。 图3-1
为单位 */
/* 栈不存在时值为
NULL */
/* 栈顶指针 */ /* 当前已分配空间,以元素
2 栈的初始化
Status Init_Stack(void)
{
SqStack S ;
S.bottom=(ElemType *)malloc(STACK_SIZE *sizeof(ElemType)); if (! S.bottom) return ERROR;
f e d b a
图3-2 (动态)堆栈变化示意图
基本操作的实现
1 栈的类型定义
#define STACK_SIZE 100
*/ /* 栈初始向量大小
#define STACKINCREMENT 10
配增量 */
/* 存储空间分
#typedef int ElemType ; typedef struct sqstack { ElemType *bottom; ElemType *top; int stacksize ;
int k, *e ; }
S=Init_Stack(); while (n>0) { k=n%d ; push(S , k) ; n=n/d ;
/* 求出所有的余数,进栈 */
while (S.top!=0)
{ pop(S, e) ;
/* 栈不空时出栈,输出 */
printf(“%1d” , *e) ; } }
算法思想:设置一个栈,当读到左括号时,左括号进
栈。当读到右括号时,则从栈中弹出一个元素,与读到 的左括号进行匹配,若匹配成功,继续读入;否则匹配 失败,返回FLASE。
算法描述
#define TRUE 0 #define FLASE -1
SqStack S ;
S=Init_Stack() ; /*堆栈初始化*/ int Match_Brackets( ) { char ch , x ; scanf(“%c” , &ch) ;
/* 申请新结点失败,返回错误标志 */
p->data=e ;
p->next=top->next ;
top->next=p ; return OK;
/* 钩链 */
(3) 弹栈(元素出栈)
Status pop(Stack_Node *top , ElemType *e)
/* 将栈顶元素出栈 */
{
第3章 栈和队列
栈和队列是两种应用非常广泛的数据结构,它们都 来自线性表数据结构,都是“操作受限”的线性表。 栈在计算机的实现有多种方式:
◆ 硬堆栈:利用CPU中的某些寄存器组或类似的硬 件或使用内存的特殊区域来实现。这类堆栈容量有限, 但速度很快; ◆ 软堆栈:这类堆栈主要在内存中实现。堆栈容量 可以达到很大。在实现方式上,又有动态方式和静态 方式两种。 本章将讨论栈和队列的基本概念、存储结构、基本 操作以及这些操作的具体实现。
{ if ( S.top==0 ) return ERROR ;
*/ /* 栈空,返回错误标志
*e=S.stack_array[S.top] ;
S.top-- ;
return OK ; }
当栈满时做进栈运算必定产生空间溢出,简称“上 溢”。上溢是一种出错状态,应设法避免。
当栈空时做退栈运算也将产生溢出,简称“下溢”。 下溢则可能是正常现象,因为栈在使用时,其初态或终 态都是空栈,所以下溢常用来作为控制转移的条件。
an ⋯⋯ ai ⋯⋯ a2 a1
顺序栈示意图
2 栈的抽象数据类型定义
ADT Stack{ 数据对象:D ={ ai|ai∈ElemSet, i=1,2,…,n,n≥0 }
数据关系:R ={<ai-1, ai>|ai-1,ai∈D, i=2,3,…,n }
基本操作:初始化、进栈、出栈、取栈顶元素等 } ADT Stack
S.top=S.bottom ;
相同 */
/* 栈空时栈顶和栈底指针
S. stacksize=STACK_SIZE;
return OK ;
}
3 压栈(元素进栈)
Status push(SqStack S , ElemType e)
{ if (S.top-S.bottom>=S. staБайду номын сангаасksize-1)
采用静态一维数组来存储栈。
栈底固定不变的,而栈顶则随着进栈和退栈操作变 化的,
◆ 栈底固定不变的;栈顶则随着进栈和退栈操作而 变化,用一个整型变量top(称为栈顶指针)来指示当 前栈顶位置。
◆ 用top=0表示栈空的初始状态,每次top指向栈 顶在数组中的存储位置。
◆ 结点进栈:首先执行top加1,使top指向新的 栈顶位置,然后将数据元素保存到栈顶(top所指的 当前位置)。
c b a
top bottom
b a
bottom Top=2 元素c进栈
e d b a
Top=4 栈满
bottom
Top=3 3个元素进栈
图3-3 静态堆栈变化示意图
基本操作的实现
1 栈的类型定义
/* 栈向
# define MAX_STACK_SIZE 100
量大小 */
# typedef int ElemType ; typedef struct sqstack { ElemType stack_array[MAX_STACK_SIZE] ; int top; }SqStack ;
return ERROR;
*/ /* 栈满,返回错误标志
S.top++ ;
顶 */
/*
栈顶指针加1 */
/* e成为新的栈 */
S.stack_array[S.top]=e ; return OK; }
/* 压栈成功
4 弹栈(元素出栈)
Status pop( SqStack
/*弹出栈顶元素*/
S, ElemType *e )
采用动态一维数组来存储栈。所谓动态,指的是栈 的大小可以根据需要增加。
◆ 用bottom表示栈底指针,栈底固定不变的;栈 顶则随着进栈和退栈操作而变化。用top(称为栈顶 指针)指示当前栈顶位置。 ◆ 用top=bottom作为栈空的标记,每次top指向 栈顶数组中的下一个存储位置。 ◆ 结点进栈:首先将数据元素保存到栈顶(top所 指的当前位置),然后执行top加1,使top指向栈顶 的下一个存储位置;
*/
3.2 栈的应用
由于栈具有的“后进先出”的固有特性,因此,栈 成为程序设计中常用的工具和数据结构。以下是几个栈 应用的例子。
3.2.1 数制转换
十进制整数N向其它进制数d(二、八、十六)的转 换是计算机实现计算的基本问题。 转换法则:该转换法则对应于一个简单算法原理: n=(n div d)*d+n mod d 其中:div为整除运算,mod为求余运算
top 空栈
⋀ top
a4 a3 a2
a1 ⋀
图3-4 链栈存储形式
非空栈
2
链栈基本操作的实现
(1) 栈的初始化
相关文档
最新文档