- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构 主要讨论的问题:栈与队列的逻辑结构;栈与队列的存储结构;栈与队列的应用. * 第三章 栈和队列 §3.1栈 .回忆:线性表的插入与删除操作. .栈的定义:是限定仅在表尾进行插入或删除的线性表. .栈顶:表尾. .栈底:表头. .栈的示意图表示 .栈的特点:先进后出. .栈的基本操作:初始化,判空,判满,取栈顶元素,插入(进栈)与删除(出栈)等. 例1.若元素a、b、c、d、e、f依次进栈,允许进栈、退栈操作交替进行,但不允许连续三次进行退栈工作,则不可能得到的出栈序列是() A.dcebfa B.cbdaef C.bcaefd D.afedcb 例2.一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是( ). A. 2 3 4 1 5 B. 5 4 1 3 2 C. 2 3 1 4 5 D. 1 5 4 3 2 .栈的存储结构 .栈的顺序存储结构与链式存储结构 .栈的顺序存储结构 ----顺序栈 . 顺序栈的初始化 . 顺序栈的进栈与判满 . 顺序栈的出栈与判空 .栈的应用 例3.设有两个栈S1,S2都采用顺序方式存储,并且共享一个存储区[0..maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计S1,S2有关入栈和出栈的操作算法。 . 分析:两栈共享向量空间,将两栈栈底设在向量两端,初始时,s1栈顶指针为-1,s2栈顶为maxsize。两栈顶指针相邻时为栈满。 #define maxsize 20 //两栈共享顺序存储空间所能达到的最多元素数 #define ElemType int //假设元素类型为整型 typedef struct { ElemType stack[maxsize]; //栈空间 int top[2]; //top为两个栈顶指针 }stk; stk s; int push(int i, int x) { //入栈操作. i为栈号,i=0表示左边的栈s1,i=1表示右边的栈 s2,x是入栈元素.入栈成功返回1,否则返回0. if(i0||i1){ cout“栈号输入不对”;exit(0);} if (s.top[1]-s.top[0]==1) { cout“栈已满\n”; return (0);} switch(i) {case 0: s.stack[++s.top[0]]=x; return(1); break; case 1: s.stack[--s.top[1]]=x; return(1); } }//算法结束 . 进栈之前要判断栈是否满;若不满,则 栈顶指针要指示出即将进栈元素在栈中的位置. ElemType pop(int i) { //退栈算法.i代表栈号,i=0时为s1栈,i=1时为s2栈.退栈成功返回退栈元素,否则返回-1. if (i0 || i1){cout“栈号输入错误\n”;exit(0);} switch(i) { case 0: if(s.top[0]==-1) {cout“栈空\n”;return(-1);} else return(s.stack[s.top[0]--]); case 1: if(s.top[1]==maxsize) {cout“栈空\n”;return(-1);} else return(s.stack[s.top[1]++]); } }//算法结束 . 出栈之前要判断栈是否空;若不空,则 栈顶指针指向次栈顶即可. 例4.设表达式以字符形式已存入数组E[n]中,‘#’为表达式的结束符,试写出判断表达式中括号(‘(’和‘)’)是否配对的C语言描述算法:EXYX(E); (注:算法中可调用栈操作的基本算法) . 分析:判断表达式中括号是否匹配,可通过栈实现.简单说,就是当读到左括号时,左括号进栈;当读到右括号时,左括号退栈。即退栈时,若栈顶元素是左括号,则新读到的右括号与栈顶左括号就可消去。如此下去,输入表达式结束时,栈为空则正确,否则括号不匹配. int Check(char E[ ], int n) { char s[30]; //s是一维数组,容量足够大,用作存放括号的栈. int top=0; //top用作栈顶指针. s[top]= ‘#’; //‘#’先入
文档评论(0)