数据结构严蔚敏ppt课件第3章.ppt
《数据结构严蔚敏ppt课件第3章.ppt》由会员分享,可在线阅读,更多相关《数据结构严蔚敏ppt课件第3章.ppt(109页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章栈和队列【课前思考【课前思考】1. 什么是线性结构?什么是线性结构? 简单地说,线性结构是一个数据元素的序列。2. 你见过餐馆中一叠一叠的盘子吗?如果它们是按你见过餐馆中一叠一叠的盘子吗?如果它们是按1,2,n 的次序往上叠的,那么使用时候的次序应的次序往上叠的,那么使用时候的次序应是什么样的?是什么样的? 必然是依从上往下的次序,即n,2,1。它们遵循的是后进先出的规律,这正是本章要讨论的栈的结构特点。3. 在日常生活中,为了维持正常的社会秩序而出现在日常生活中,为了维持正常的社会秩序而出现的常见现象是什么?的常见现象是什么? 是排队。在计算机程序中,模拟排队的数据结构是队列。【学习目
2、标【学习目标】 1. 掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们。 2. 熟练掌握栈类型的两种实现方法。 3. 熟练掌握循环队列和链队列的基本操作实现算法。 4. 理解递归算法执行过程中栈的状态变化过程。 栈和队列是在程序设计中被广泛使用的两种线性数据结构,因此本章的学习重点在于掌握这两种结构的特点,以便能在应用问题中正确使用。【知识点【知识点】顺序栈、链栈、循环队列、链队列【重点和难点【重点和难点】【学习指南【学习指南】 在这一章中,主要是学习如何在求解应用问题中适当地应用栈和队列,栈和队列在两种存储结构中的实现都不难,但应该对它们了如指掌,特别要注意它们的基本
3、操作实现时的一些特殊情况,如栈满和栈空、队满和队空的条件以及它们的描述方法。本章要求必须完成的算法设计题为:3.15,3.17,3.19,3.22, 3.27 ,3.28,3.30,3.31,3.32。其中前4个主要是练习栈的应用,后4个主要是有关队列的实现方法的练习。通常称,栈和队列是限定插入和删除插入和删除只能只能在表的“端点端点”进行的线性表。 线性表线性表 栈栈 队列队列Insert(L, i, x) Insert(S, n+1, x) Insert(Q, n+1, x) 1in+1 Delete(L, i) Delete(S, n) Delete(Q, 1) 1in栈和队列是两种常用
4、的数据类型栈和队列是两种常用的数据类型3.1 栈栈3.2 栈的应用举例栈的应用举例3.4 队列队列 目目 录录3.3 栈与递归的实现栈与递归的实现3.1 栈栈一、栈的定义一、栈的定义 栈栈(stack)(stack)作为一种限定性线性表,是将线性表的插入插入和删除删除运算限制为仅在表的一端仅在表的一端进行。 通常将表中允许进行插入、删除操作的一端称为栈顶栈顶(Top)(Top),因此栈顶的当前位置是动态变化的,它由一个称为栈顶指针的位置指示器指示。同时表的另一端为固定的一端,被称为栈底栈底(Bottom)(Bottom)。当栈中没有元素时称为空栈。栈的插入操作被形象地称为进栈或入栈,删除操作称
5、为出栈或退栈。 插入:最先放入栈中元素在栈底,最后放入的元素在栈顶; 删除:最后放入的元素最先删除,最先放入的元素最后删除。 栈是一种后进先出(Last In First OutLast In First Out)的线性表,简称为LIFO表。ana2a1进栈出栈栈顶栈底进栈出栈(a) 栈的示意图(b) 铁路调序栈的表示图图3.1 栈栈ana2a1进栈出栈栈顶栈底进栈出栈(a) 栈的示意图(b) 铁路调序栈的表示 例:设一个栈的输入序列为例:设一个栈的输入序列为A,B,C,D,则借助一则借助一个栈所得到的输出序列不可能是个栈所得到的输出序列不可能是 。(A) A,B,C,D(B) D,C,B,A
6、 (C) A,C,D,B(D) D,A,B,C 答答:可以简单地推算可以简单地推算,得容易得出得容易得出D,A,B,C是不可是不可能的能的,因为因为D先出来先出来,说明说明A,B,C,D均在栈中均在栈中,按照入栈按照入栈顺序顺序,在栈中顺序应为在栈中顺序应为D,C,B,A,出栈的顺序只能是出栈的顺序只能是D,C,B,A。所以本题答案为。所以本题答案为D。二、栈的主要操作二、栈的主要操作 1.初始化栈:初始化栈:InitStack(&S)将栈S置为一个空栈(不含任何元素)。2.进栈:进栈:PUSH(&S,X)将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压入”。3.出栈:出栈: POP
7、(&S,&e) 删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹出”。4.取栈顶元素:取栈顶元素: GETTOP(S,&e)取栈S中栈顶元素。5.判栈空:判栈空: EMPTY(S)判断栈S是否为空,若为空,返回值为1,否则返回值为0。三、三、栈的抽象数据类型描述栈的抽象数据类型描述 ADT Stack 数据对象数据对象: D=ai| ai ElemSet,i=1,2,n,n 0 数据关系数据关系: R1= | ai-1 , ai D, i=1,2,n 基本操作:基本操作: InitStack(&S) 操作前提: S为未初始化的栈。 操作结果: 将S初始化为空栈。 ClearStack(
8、&S) 操作前提: 栈S已经存在。 操作结果: 将栈S置成空栈。 StackEmpty(S) 操作前提: 栈S已经存在。 操作结果: 若栈S为空,则返回TRUE,否则FALSE。 StackLength(S) 操作前提:栈S已经存在。 操作结果:返回S的元素个数即栈的长度。 IsFull(S) 操作前提: 栈S已经存在。 操作结果: 判栈满函数,若S栈已满,则函数值为TRUE, 否则为FALSE。 StackTraverse(S,visit() 操作前提:栈S已经存在且非空。 操作结果:从栈底到栈顶依次对S底每个元素调用函数visit()。一旦visit()失败,则操作失效。 Push(&S,
9、e) 操作前提:栈S已经存在。 操作结果:在S的顶部插入(亦称压入)元素e;若S栈未满,将e插入栈顶位置,若栈已满,则返回FALSE,表示操作失败,否则返回TRUE。 Pop(&S,&e) 操作前提:栈S已经存在。 操作结果:删除(亦称弹出)栈S的顶部元素,并用e带回该值;若栈为空,返回值为FALSE,表示操作失败,否则返回TRUE。 GetTop(S, &e) 操作前提: 栈S已经存在。 操作结果:取栈S的顶部元素。与Pop(&S, &e)不同之处在于GetTop(S,&e)不改变栈顶的位置。ADT Stack 1. 顺序栈顺序栈 顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元
10、依次存放一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈的操作的特殊性, 还必须附设一个位置指针位置指针toptop(栈顶指针)来动态地指示栈顶元素动态地指示栈顶元素在顺序栈中的位置位置。通常以top=0或 top=-1表示空栈。顺序栈的存储结构可以用C语言中的一维数组来表示。 栈的顺序存储结构定义如下: 四、四、 栈的表示和实现栈的表示和实现 #define STACK_INIT_SIZE 100 /存储空间初始分配量#define STACKINCREMENT 10 /存储空间分配增量typedef struct SElemType *base; /在栈构造前和销毁后bas
11、e值为NULL SElemType *top; /栈顶指针 int stacksize; SqStack; /当前已分配存储空间或简单定义如下: #define M 100 int sM; int top;图3.2 顺序栈中的进栈和出栈 Top指向栈顶元素指向栈顶元素初态:初态:top=-1; 空栈,栈中无元素,进栈:进栈:top=top+1; stop=x;退栈:退栈:取stop; top=top-1;栈满:栈满:top=M-1;栈溢出(上溢),不能再进栈(错误状态)top=-1时不能退栈,下溢(正常状态,常作控制条件)(1 1)构造空顺序栈算法)构造空顺序栈算法: :初始化栈初始化栈Sta
12、tus InitStack ( SqStack &S ) / / 构造一个空栈构造一个空栈 S SS.base = ( SElemType * ) malloc ( STACK_INIT_SIZE * sizeof ( SElemType ) );if ( ! S.base ) exit ( OVERFLOW ); /为栈分配存储空间失败为栈分配存储空间失败S.top = S.base; / / 令栈顶指针令栈顶指针 = = 栈底指针栈底指针/ / 设置栈的当前可使用的最大容量设置栈的当前可使用的最大容量S.stacksize = STACK_INIT_SIZE; return OK; / I
13、nitStack/ InitStack2.2.顺序栈基本操作的实现如下顺序栈基本操作的实现如下: :程序描述:程序描述:/This program is to initialize a stack # include # include # include # define STACK_INIT_SIZE 100 # define STACKINCREMENT 10 # define OK 1 # define ERROR 0 typedef int SElemType; typedef struct /define structure SqStack() SElemType *base; S
14、ElemType *top; int stacksize; SqStack; int InitStack(SqStack &S) /InitStack() sub-function S.base=(SElemType )malloc(STACK_INIT_SIZE*sizeof(SElemType); if (!S.base) printf(“Allocate space failure !n“); return (ERROR); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return (OK); /InitStack() end void main
15、() /main() function SqStack S; if (InitStack(S) printf (Success! The stack has been created !n“); printf (.OK!n“); getch(); (2) 取顺序栈的栈顶元素取顺序栈的栈顶元素 Status GetTop ( SqStack S, SElemType &e ) / 如果栈如果栈 S 空,返回空,返回 ERROR;如果栈;如果栈 S 不空,用不空,用 e 返回栈返回栈 S 的栈的栈顶元素,并返回顶元素,并返回 OK 。if ( S.top = = S.base ) return E
16、RROR; / 如果栈如果栈 S 为空,则返回为空,则返回 ERROR e = *( S.top - 1); / 将栈顶指针减将栈顶指针减 1 后所指向的单元内的值赋给后所指向的单元内的值赋给 e return OK; / GetTop / GetTop(3)将元素压入顺序栈算法(将元素压入顺序栈算法(进栈)进栈)Status Push ( SqStack &S, SElemType e ) / 将元素将元素 e 插入到栈插入到栈 S 中,成为新的栈顶元素中,成为新的栈顶元素 if ( S.top - S.base S.stacksize ) / 如果栈满,则追加存储空间如果栈满,则追加存储空
17、间 S.base = ( SElemType S.base = ( SElemType * * ) realloc ( S.base, ) realloc ( S.base, ( S.stacksixe + STACKINCREMENT( S.stacksixe + STACKINCREMENT* * sizeof ( SElemType sizeof ( SElemType ) ); ) ); if ( ! S.base ) exit ( OVERFLOW ); / if ( ! S.base ) exit ( OVERFLOW ); / 追加存储空间失败追加存储空间失败 S.top = S
18、.base + S.stacksizeS.top = S.base + S.stacksize; / ; / 修改栈顶指针修改栈顶指针 S.stacksizeS.stacksize += STACKINCREMENT; / += STACKINCREMENT; / 修改当前栈的存储空间修改当前栈的存储空间 / if / if 结束结束 * *S.top += e; / S.top += e; / 先将先将 e e 送入栈顶,然后将栈顶指针加送入栈顶,然后将栈顶指针加 1 1 return OK; return OK; / Push / Push(4)将元素弹出顺序栈算法(将元素弹出顺序栈算法(
19、退栈)退栈)Status Pop ( SqStack &S, SElemType &e ) / 如果栈如果栈 S 空,返回空,返回 ERROR ;如果栈;如果栈 S 不空,删除不空,删除 S 栈顶元素,栈顶元素,用用 e 返回其值,并返回返回其值,并返回 OK 。 if ( S.top = = S.base ) return ERROR; / 如果栈如果栈 S 为空,则返回为空,则返回 ERROR e = *-S.top; / 先令先令 top 减减 1,再将,再将 top 所指单元值赋给所指单元值赋给 e return OK; / Pop / Pop(5) 判栈空否判栈空否 Int Empt
20、y ( SqStack S) / 如果栈如果栈 S 空,返回空,返回 1 ;如果栈;如果栈 S 不空,返回不空,返回 0 。if ( S.top = = S.base ) return 1; / 如果栈如果栈 S 为空,则返回为空,则返回 1else return 0; / 如果栈如果栈 S 为空,则返回为空,则返回 0 / / Empty end3栈的共享栈的共享有时,一个程序设计中,需要使用多个同一类型的栈,这时候,可能会产生一个栈空间过小,容量发生溢出,而另一个栈空间过大,造成大量存储单元浪费的现象。 为了充分利用各个栈的存储空间,这时可以采用多个栈共享存储单元,即给多个栈分配一个足够大
21、的存储空间,让多个栈实现存储空间优势互补。 栈 1 顶 栈 2 顶 栈 1 底 栈 2 底 图 3-3 两个栈共享存储单元示意图 栈空:栈空:top1=0,top2=M-1;top1=0,top2=M-1;栈满:栈满:top1+1=top2top1+1=top2两个栈共享存储单元可用如下两个栈共享存储单元可用如下C C语句描述:语句描述:#define MAXSIZE 100 #define DUSTACKSIZE MAXSIZE typedef struct DuSqStack SElemType dataMAXSIZE; int top1; /top1 is the pointer of
22、DuSqStack/top1 is the pointer of DuSqStack S1 S1 int top2; /top2 is the pointer of DuSqStack/top2 is the pointer of DuSqStack S2 S2 int flag;DuSqStack; /或:或:#define MAXSIZE 100Struct duseqstack elemtype datamaxsize; int top2 ; /两个栈的栈顶指针两个栈的栈顶指针 int flag; (1)两个栈共享存储单元的进栈算法)两个栈共享存储单元的进栈算法Status DuSqSt
23、ackPush ( DuSqStack &S, SElemType x ) / / 栈栈 S S 为共享顺序栈类型为共享顺序栈类型 DuSqStackDuSqStack,含,含 top1top1、top2 top2 和和 data data 数组域;数组域;/ / 此算法将元素此算法将元素 x x 放入栈放入栈 S S 中;如果两个栈满,则返回中;如果两个栈满,则返回 ERRORERROR if ( ( S.top1+1 ) = = ( S.top2 ) ) return ERROR; / / 如果两个栈满,则返回如果两个栈满,则返回 ERRORERROR else / / 如果栈未满,则进行
24、入栈操作如果栈未满,则进行入栈操作 if ( ( S.flag ! = 1 ) & ( S.flag ! = 2 ) ) return ERROR; / / 如果如果 flag flag 不为不为 1,21,2,则返回,则返回 ERRORERROR else / / 如果如果 flag flag 为为 1 1 或或 2 2,则入栈,则入栈 switch ( S.flag ) case 1 : / / 标志位标志位 flag flag 为为 1 1 S.dataS.top1 = x; / / 元素元素 x x 入栈入栈 S1S1 S.top1+; / / 修改栈修改栈 S1 S1 的栈顶指针的栈
25、顶指针 break; case 2 : / / 标志位标志位 flag flag 为为 2 2 S.dataS.top2 = x; / / 元素元素 x x 入栈入栈 S2S2 S.top2- -; / / 修改栈修改栈 S2 S2 的栈顶指针的栈顶指针 break; / switch / switch 结束结束 return OK; / else / else 结束结束 / else / else 结束结束 / DuSqStackPush/ DuSqStackPush(2)两个栈共享存储单元的退栈算法)两个栈共享存储单元的退栈算法Status DuSqStackPop ( DuSqStack
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 严蔚敏 ppt 课件
限制150内