第03章栈和队列.ppt
《第03章栈和队列.ppt》由会员分享,可在线阅读,更多相关《第03章栈和队列.ppt(75页珍藏版)》请在课桌文档上搜索。
1、1,第3章 栈和队列,3.2 队列,3.1 栈,本章小结,2,3.1.1 栈的基本概念,3.1.2 栈的顺序存储结构,3.1.3 栈的链式存储结构,3.1 栈,3,栈是一种特殊的线性表,这种线性表上的插入和删除运算限定在表的某一端进行。表中允许进行插入、删除操作的一端称为栈顶;另一端称为栈底。处于栈顶位置的数据元素称为栈顶元素。不含任何数据元素的栈称为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。,3.1.1 栈的基本概念,4,栈的特点是后进先出。举一个例子说明栈结构的特征,假设有一个很窄的死胡同,胡同里能容纳若干人,但每次只能容许一个人进出。现有五个人,分别编号为,按
2、编号的顺序依次进入此胡同,如图3.1所示。此时若编号为的人要退出胡同,必须等退出后才可以。若要退出,则必须等到、依次都退出后才行。这里,人进出胡同的原则是后进去的先出来。,5,栈可以比作这里的死胡同,栈顶相当于胡同口,栈底相当于胡同的另一端,进、出胡同可看作栈的插入、删除运算。插入、删除运算都在栈顶进行,相当于进出都经过胡同口。这表明栈修改的原则是先进后出(或后进先出)。因此栈又称为后进先出线性表。,6,栈顶,栈底,出栈,进栈,栈示意图,7,例1 设有4个元素a、b、c、d进栈,给出它们所有可能的出栈次序。答:所有可能的出栈次序如下:abcd abdc acbd acdb adcb bacd
3、badc bcad bcda bdca cbad cbda cdba dcba,8,例2 设一个栈的输入序列为A,B,C,D,则借助一个栈所得到的输出序列不可能是。(A)A,B,C,D(B)D,C,B,A(C)A,C,D,B(D)D,A,B,C,答:可以简单地推算,得容易得出D,A,B,C是不可能的,因为D先出来,说明A,B,C均在栈中,按照入栈顺序,在栈中顺序应为D,C,B,A,出栈的顺序只能是D,C,B,A。所以本题答案为D。,9,例3 已知一个栈的进栈序列是1,2,3,n,其输出序列是p1,p2,pn,若p1=n,则pi的值。(A)i(B)n-i(C)n-i+1(D)不确定,答:当p1=
4、n时,输出序列必是n,n-1,3,2,1,则有:p2=n-1,p3=n-2,pn=1推断出pi=n-i+1,所以本题答案为C。,10,例4 设n个元素进栈序列是1,2,3,n,其输出序列是p1,p2,pn,若p1=3,则p2的值。(A)一定是2(B)一定是1(C)不可能是1(D)以上都不对,答:当p1=3时,说明1,2,3先进栈,立即出栈3,然后可能出栈,即为2,也可能4或后面的元素进栈,再出栈。因此,p2可能是2,也可能是4,n,但一定不能是1。所以本题答案为C。,11,栈的基本运算至少应包括以下5种:(1)初始化栈InitStack(st):构造一个空栈st。(2)进栈Push(st,x)
5、:将元素x插入到栈st中作为栈顶元素。(3)出栈Pop(st,x):其作用是当栈st不空时,将栈顶元素赋给x,并从栈中删除当前栈顶。(4)取栈顶元素GetTop(st,x):若st不空,由x返回当前的栈顶元素,当栈st为空时,结果为一特殊标志(。(5)判断栈是否为空StackEmpty(st):若栈st为空,则返回1;否则返回0。,12,例3.3 利用栈的基本运算,编写一个算法输入若干整数,以0标识输入结束。然后按与输入相反次序输出这些整数。,解:使用一个栈实现本例要求,先将输入的整数进栈,然后出栈并输出。对应的算法如下:void Invert()int n;cout n;if(n=0)bre
6、ak;/输入值n为0时退出循环 Push(st,n);/n进栈 cout“输出序列:”;while(!StackEmpty(st)/栈不空时循环 Pop(st,n);/出栈n cout n“”;/输出n,13,3.1.2 栈的顺序存储结构 栈的顺序存储结构称为顺序栈。顺序栈通常由一个一维数组和一个记录栈顶元素位置的变量组成。习惯上将栈底放在数组下标小的那端。假设用一维数组sq5表示一个栈,则需使用一个变量top记录当前栈顶下标值。图(a)表示顺序栈为栈空,这也是初始化运算得到的结果。此时栈顶下标值top=-1。如果作出栈运算,则会“下溢”。,14,顺序栈进栈和出栈示意图,top,-1,top,
7、top,top,15,顺序栈类型定义如下:顺序栈被定义为一个结构体类型,它有两个域:data和top。Data为一个一维数组,用于存储栈中元素,ElemType为栈元素的数据类型,可以根据需要而指定为某种具体的类型。top为int型,它的实际取值范围为0 StackSize-1。top=-1表示栈空;top=StackSize-1表示栈满。const int StackSize=100;/顺序栈的初始分配空间 typedef struct sqst ElemType dataStackSize;/保存栈中元素 int top;/栈指针 SqStack;,16,顺序栈的基本运算算法如下:(1)初
8、始化栈运算算法 此算法主要用于创建一个空栈,并将栈顶下标top初始化为-1。void InitStack(SqStack,17,(2)进栈运算算法 其主要操作是:栈顶下标加1,将进栈元素放进栈顶下标所指的位置上。int Push(SqStack,18,(3)出栈运算算法 其主要操作是:先将栈顶元素取出,然后将栈顶下标减1。int Pop(SqStack,19,(4)取栈顶元素运算算法 其主要操作是:将栈中top处的元素取出赋给变量x。int GetTop(SqStack st,ElemType,20,(5)判断栈空运算算法 其主要操作是:若栈为空(top=-1)则返回值1,否则返回0。int
9、StackEmpty(SqStack st)if(st.top=-1)return 1;else return 0;,21,例3.4 设计一个算法,判断一个表达式中符号“(”与“)”、“”与“”、“”与“”是否匹配。若匹配,则返回1;否则返回0。解:设置一个栈st,用i扫描表达式exps:遇到(、和时,将其进栈,遇到)、和时,判断栈顶是否是匹配的括号。若不是,则退出扫描过程,返回0;否则直到exps扫描完毕为止。若top=0,则返回1。对应算法如下:(以下为完整程序)#include const int Max=100;int match(char*exps)char stMax,top=-1
10、,i=0;int nomatch=0;while(expsi!=0&nomatch=0),22,switch(expsi)case(:sttop=expsi;top+;break;case:sttop=expsi;top+;break;case:sttop=expsi;top+;break;case):if(sttop=()top-;else nomatch=1;break;case:if(sttop=)top-;else nomatch=1;break;case:if(sttop=)top-;else nomatch=1;break;,23,i+;if(nomatch=0),24,3.1.3
11、 栈的链式存储结构 栈的链式存储结构是以某种形式的链表作为栈的存储结构,栈的链式存储结构简称为链栈,其组织形式与单链表类似。如图3.4所示。其中,单链表的第一个节点就是链栈栈顶结点,ls称为栈顶指针。,25,链栈示意图,栈由栈顶指针ls唯一确定。栈中的其他结点通过它们的next域链接起来。栈底结点的next域为NULL。因链栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况。,26,链栈的类型定义如下:typedef struct stnode ElemType data;/存储结点数据 struct stnode*next;/指针域 LinkStack;,27,在链栈中,栈的基本运
12、算算法如下:(1)初始化栈运算算法 其主要操作是:创建一个头结点*ls,用ls=NULL标识栈为空栈。void InitStack(LinkStack*,28,(2)进栈运算算法 其主要操作是:先创建一个新节点,其data域值为x;然后将该结点插入到*ls结点之后作为栈顶结点。void Push(LinkStack*,29,(3)出栈运算算法 其主要操作是:将栈顶结点(即ls-next所指结点)的data域值赋给x,然后删除该栈顶结点。int Pop(LinkStack*,30,(4)取栈顶元素运算算法 其主要操作是:若栈为空(即ls-next所指结点)的data域值赋给x。int GetTo
13、p(LinkStack*ls,ElemType,31,(5)判断栈空运算算法 其主要操作是:若栈为空(ls-next=NULL),则返回值1,否则返回0。int StackEmpty(LinkStack*ls)if(ls=NULL)return 1;else return 0;,32,例3.5 假设以I和O分别表示进栈和出栈操作,栈的初态和终态均为空,进栈和出栈的操作序列可表示为仅由I和O组成的序列。下面所示的序列中哪些是合法的?A.IOIIOIOO B.IOOIOIIO C.IIIOIOIO D.IIIOOIOO 通过对的分析,写出一个算法判定所给的操作序列是否合法。若合法返回1;否则返回0
14、。(假设被判定的操作序列已存入一维数组中),33,解:A、D均合法,而B、C不合法。因为在B中,先进栈一次,立即出栈2次,这会造成栈下溢。在C中共进栈5次,出栈3次,栈的终态不为空。本例用一个链栈来判断操作序列是否合法,其中A为存放操作序列的字符数组,n为该数组的元素个数(这里的ElemType类型设定为char。),34,int Judge(char A,int n)int i;ElemType x;LinkStack*ls;InitStack(ls);for(i=0;inext=NULL);/栈为空时返回1,否则返回0,35,3.2 队列,3.2.1 队列的基本概念,返回,3.2.2 队列
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 03 队列
![提示](https://www.desk33.com/images/bang_tan.gif)
链接地址:https://www.desk33.com/p-675518.html