- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]第3章 堆栈和队列1
第三章 堆栈和队列 3.1 堆栈(Stack) 基本概念、抽象数据类型、顺序表示和实现、链式表示和实现 3.2 堆栈应用 括号匹配问题 3.3 队列(Queue) 基本概念、抽象数据类型、顺序队列、顺序循环队列、链式队列、队列的应用 1. 定义 注:堆栈可以完成比较复杂的数据元素特定序列的转换任务,但它不能完成任何输入输出序列的转换任务。 例1:堆栈是什么?它与一般线性表有什么不同? 例2、一个栈的输入序列为1,2,3,若在入栈的过程中允许出栈,则可能得到的出栈序列是什么? 解:可以通过穷举所有可能性来求解: ① 1入1出, 2入2出,3入3出, 即123; ② 1入1出, 2、3入,3、2出, 即132; ③ 1、2入,2出, 3入3出, 即231; ④ 1、2入,2、1出,3入3出, 即213; ⑤ 1、2、3入,3、2、1出, 即321; 合计有5种可能性。 例3、一个栈的输入序列是12345,若在入栈的过程中允许出栈,则栈的输出序列43512可能实现吗?12345的输出呢? 解: 43512不可能实现,主要是其中的12顺序不能实现; 12345的输出可以实现,每压入一数便立即弹出即可。 二、堆栈抽象数据类型 数据集合:{ a0, a1, … , an-1 } ai的数据类型为 DataType 操作集合:(1)StackInitiate(S) 初始化堆栈S (2)StackNotEmpty(S) 堆栈S非空否 (3)StackPush(S,x) 入栈 (4)StackPop(S,d) 出栈 (5)StackTop(S,d) 取栈顶数据元素 等 三、堆栈的顺序表示和实现 1、顺序(堆)栈 顺序存储结构的堆栈。 2、顺序栈的存储结构 它是利用一组地址连续的存储 单元依次存放自栈底到栈顶的数据元 素,同时设指针top指示栈顶元素的 当前位置。用C语言定义为: typedef struct { DataType stack[MaxStackSize]; int top; }SeqStack; 问:顺序表和顺序栈的操作有何区别? 问:为什么要设计堆栈?它有什么独特用途? 例2、一个栈的输入序列是12345,若在入栈的过程中允许出栈,则栈的输出序列43512可能实现吗?12345的输出呢? 例3、 设依次进入一个栈的元素序列为c,a,b,d,则可得到出栈的元素序列是: A)a,b,c,d B)c,d,a,b C)b,c,d,a D)a,c,d,b 3、顺序栈的操作实现 (1)初始化栈 void StackInitiate(SeqStack *S) /*初始化顺序堆栈S*/ { S-top = 0; /*定义初始栈顶下标值*/ } (2)判栈非空否 int StackNotEmpty(SeqStack S) /*判顺序堆栈S非空否,非空则返回1,否则返回0*/ { if(S.top = 0) return 0; else return 1; } (3)入栈 int StackPush(SeqStack *S, DataType x) /*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0 */ { if(S-top = MaxStackSize) { printf(堆栈已满无法插入! \n); return 0; } else { S-stack[S-top] = x; S-top ++; return 1; } } (4)出栈 int StackPop(SeqStack *S, DataType *d) /*弹出顺序堆栈S的栈顶数据元素值到参数d ,出栈成功则返回1,否则返回0*/ { if(S-top = 0) { printf(堆栈已空无数据元素出栈! \n); return 0; } else { S-top --; *d = S-stack[S-top]; return 1; } } (5)取栈顶数据元素 int Stack
文档评论(0)