- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构C语言第3章
* 第3章 栈和队列 第3章 栈和队列 3.1 栈和队列引例 3.2 栈 3.3 顺序栈的存储结构及算法实现 3.4 链式栈 3.5 队列 3.6 实习: 栈的应用实例 习题3 3.1栈和队列引例 任一表达式都可看成是由操作数,运算符和界限符组成的一个串。其中,操作数可以是常数也可以是变量或常量的标识符,运算符可以是算术运算符,关系运算符和逻辑运算符等,界限符包括左右括号和表达式结束符等,例表达式7+4*(8-3)。计算机要完成表达式的求值,必须正确的解释表达式,将其翻译成正确的机器指令序列。要了解计算机的求值过程,必须先研究栈的性质。 3.2 栈 3.2.1栈的定义和基本运算 栈是限定只能在表尾进行插入和删除的线性表,并将表尾称为栈顶,表头称为栈底。图3—1给出了非空栈s=(A,B,C,D)的示意图。 图3—1 非空栈示意图 由于限定只能在栈顶进行操作,所以栈中元素必按A,B,C,D次序进栈,,按D,C,B,A次序出栈,即按后进先出(或“先进后出)的原则进行操作的。这一特点可用生活中的实例形象说明。例如每次只能容一个人进出的死胡同就相当一个栈,胡同口相当于栈顶,而胡同的另一端则为栈底。 3.2.2栈的基本运算 (1)判栈空Empty(S). 若栈为空则返回“真“,否则返回”假“; (2)入栈操作(压栈)Push(S,x) 将新元素压入栈中,使其成为栈顶元素; (3)出栈操作(弹栈)Pop(S,x) 若栈不空则返回栈顶元素,并从栈中删除栈顶元素,否则返回NULL; (4)取栈顶元素 Pettop(s,x) 若栈不空则返回栈顶元素,否则返回NULL; (5)置空栈Clear(s) 将当前栈设定为空栈; (6)求元素个数 CurrenSize(s) 求当前栈中元素的个数 。 3.3 顺序栈的存储结构及算法实现 3.3.1顺序栈 顺序栈利用一组连续的存储单元存放从栈底到栈顶的诸元素。同时用一指针top指示当前栈顶元素的位置, C语言中用一维数组来描述。 #define maxsize N typedef struct {Datatype data[maxsize+1]; int top; } Stack; (a)空栈 (b)一般情况 (c)满栈 图3—2栈中元素和栈顶指针之间的关系 3.3.2顺序栈的基本运算的实现 判栈空,置空栈,求元素个数算法容易实现,只要判断或改变s.top的值即可。下面仅给出进栈,出栈,取栈顶元素等函数的算法实现。 1. 压栈 /*算法描述3-1*/ int Push(Stack S, Datatype x) {if (S.top==maxsize) {printf(overflow\n); return(0);} S.data[++S.top]=x; return(1); } 2. 出栈 /*算法描述3-2*/ int Pop(Stack s, Datatype x) {if(S.top==0){printf(nudertflow\n);return(0)}; x=S.data[S.top]; S.top--; return(1); } 3. 取栈顶元素 /*算法描述3-3*/ int Gettop(Stack S, Datatype x) {if(S.top==0){printf(nodata\N);return(0);} x=S.data[top]; return(1); } 3.4 链式栈 链式栈的组织形式和单链表类似, 其类型说明如下 Tyoedef struct Node {Datatype data; struct Node *next; }Node, *LStack; 一个链栈由其栈顶指针唯一确定.设TOP是LStack形变量,则TOP指向栈顶元素。图3—3为链栈示意图 。top=NULL为判断栈空的条件。对链栈除非整个可用空间都被占满,否则不会出现栈满的情形。其操作是线性链表操作的特例,易实现. 请读者自行补充。 图3.3 链栈示意图 3.5 队列 3.5.1队列的定义和运算 和栈相反,队列是一种“先进先出”的线性表。他只允许再表的一端(称表尾)插入元素,在表的另一端(表头)删除元素。队列和日常生活中的排队是一致的,最早进入队列的元素最早得到服务。图3—4给出可队列示意图。 图3.4 队列示意图 队列的操作与栈的操作类似,不同的是删除运算是在表头进行。 (1)
文档评论(0)