第3章 栈和队列总结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章 栈和队列
(4)出栈 elemtype pop(seqstack *s)//出栈 { if(s->top<0) { printf("stack empty!\n"); return 0; } else { return(s->stack[s->top--]); } } (5)取栈顶元素算法 datatype gettop(seqstack *s) { if(s->top<0) {printf(“stack empty!\n”); return(NULL); } else return(s->stack[s->top]);
第三章 栈和队列
(5)取栈顶元素算法 elemtype gettop(seqstack *s)//取栈顶元素 { if(s->top<0) { printf("stack empty!\n"); return 0; } else return(s->stack[s->top]); }
第三章 栈和队列
第三章 栈和队列
(3)入栈 int push(seqstack *s,elemtype x)//入栈 { if(s->top>=MAXSIZE-1) { printf("stack overflow!\n"); return 0; } else { s->stack[++s->top]=x; return 1; } }
第三章 栈和队列
第3章 栈和队列
3.1 栈 3.2 栈的应用举例 3.3 队列 3.4 队列的应用举例
第三章 栈和队列
第3章 栈和队列
栈和队列是两类特殊的线性表,其逻辑结构仍然是线性 结构,但栈和队列是运算受限的线性表。栈和队列结构被广 泛应用于各种程序设计中。 本章讨论栈和队列的定义、运算及其实现等。
有时可以将多个栈安排在同一个顺序存储空间中,实现多个栈共 享存储空间。 假定两个栈共享空间,可以给它们分配一个长度为m的数组空间 如图3.3所示。
0 1 2 3 … … … … … m-1
栈1底 栈1
栈1顶
栈2顶 栈2
栈2底
图 3.3
两个栈共享空间示意图
两个栈共享的数据类型定义如下: typedef struct {datatype stack[m]; int top[2]; /* top[0]和top[1]分别为两栈的栈顶指针*/ }sharedstack;
第三章 栈和队列
两个栈共享存储单元的部分运算算法如下: (1)置空栈 void setnull(sharedstack *s) {s->top[0]=-1; s->top[1]=m; } /*setnull*/ (2)入栈 int push(sharedstack *s,int i,datatype x) {if(i<0||i>1||s->top[0]+1= =s->top[1]) return FALSE; else { if(i==0) s->stack[++s->top[0]]=x; else s->stack[--s->top[1]]=x; return TRUE; } }/*push*/
第三章 栈和队列
(3)出栈 datatype pop(sharedstack *s,int i) { if(i<0||i>1) return NULL; else if(i= =0) if (s->top[0]==-1) return NULL; else return(s->stack[s->top[0]--]); else if(s->top[1]= =m) return NULL; else return(s->stack[s->top[1]++]); }/*pop*/
第三章 栈和队列
5 4 3 2 1 0 top 5 4 3 2 1 0 5 4 3 2 1 0 5 4 3 2 1 0
top
twk.baidu.comp -1
A
D C B A
top
B A
(a)空栈
(b)A进栈
(c)B、C、D进栈
(d)D、C出栈
图3.2 栈中元素变化情况
第三章 栈和队列
在顺序栈上实现的栈的基本运算。 (1)置空栈 void setnull(seqstack *s)//置空栈 { s->top=-1; } (2)判栈空算法 int empty(seqstack *s)//判空栈 { if(s->top<0) return(0); else return(1); }
第三章 栈和队列
进栈
出栈 进栈 出栈
栈顶
an
栈底
(a)栈的示意图
…
a2 a1
(b)铁路调度站示意图 3.1 栈示例
第三章 栈和队列
3.1.2 栈的表示和实现
1.顺序栈: 栈的顺序存储结构又称为顺序栈,顺序栈也可用向量来实现。顺序栈的 类型定义如下: #define MAXSIZE 100 /*栈的最大容量,这里设为100*/ typedef int elemtype; typedef struct { elemtype stack[MAXSIZE]; int top; }seqstack; /*顺序栈类型定义*/ seqstack *s; /*定义s为指向顺序栈的指针变量*/ 在顺序栈中进栈或 出栈运算时要注意空间的“溢出”。当栈满时,若再进行入栈运算,会产 生空间“上溢” ;而当栈空时,再进行出栈运算,会产生空间“下溢” 。 图3.2说明了栈中元素与栈顶指针的关系。
第三章 栈和队列
3.1 栈
3.1.1 抽象数据类型的定义
栈是一类特殊的线性表,数据元素的插入和删除运算只能在表的一端进 行,通常将进行插入和删除的一端称为栈顶,另一端称为栈底。将元素的插 入称为入栈或进栈,元素的删除称为出栈或退栈。 栈也称为后进先出的线性表(简称LIFO表)如图3.1(a)所示。 在日常生活中,栈的形式经常出现。例如,一叠盘子或一叠书的取放、 铁路调度站,如图3.1(b)所示。 栈的基本运算: (1)置空栈setnull(s):将栈s置成空栈,建立起栈顶指针。 (2)判栈空empty(s):若s为空栈,则返回TRUE值,否则返回FALSE值。 (3)入栈push(s,x):若s未满,将x插入s栈栈顶,并使栈顶指针指向x。 (4)出栈pop(s):若s栈非空,则从栈中删去栈顶元素,返回原栈顶元素。 (5)取栈顶元素gettop(s):若s栈非空,则返回当前栈顶元素。