版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西安交通大学计教中心西安交通大学计教中心栈的定义栈的定义栈是限制在表的一端进行栈是限制在表的一端进行插入和删除操作的线性表。允插入和删除操作的线性表。允许进行插入和删除操作的一端许进行插入和删除操作的一端称为栈顶,另一端称为栈底。称为栈顶,另一端称为栈底。如果多个元素依次进栈,如果多个元素依次进栈,则后进栈的元素必然先出栈,则后进栈的元素必然先出栈,所 以 堆 栈 又 称 为 后 进 先 出所 以 堆 栈 又 称 为 后 进 先 出(LIFOLIFO)表。堆栈设有一个栈)表。堆栈设有一个栈顶指针标志栈顶位置。顶指针标志栈顶位置。 栈示意图a a1 1a a3 3a a2 2进栈进栈出栈出栈to
2、p堆栈的主要操作有:堆栈的主要操作有: 创建空栈。创建空栈。 进栈进栈(push)(push)操作操作: : 在栈顶插入元素。在栈顶插入元素。 出栈出栈(pop)(pop)操作操作: : 在栈顶删除元素。在栈顶删除元素。 读栈顶元素读栈顶元素: : 只是读出栈顶元素,并不只是读出栈顶元素,并不改变栈内元素。改变栈内元素。 顺序栈顺序栈#define STACKSIZE 100/堆栈最大可分配空间数量堆栈最大可分配空间数量class SqStackpublic: ElemType dataSTACKSIZE; /存储元素的数组存储元素的数组 int top; /栈顶指针,存储栈顶元素的下标栈顶指
3、针,存储栈顶元素的下标 SqStack() top=-1; /构造函数构造函数 void Push(ElemType x);/入栈操作入栈操作 void Pop(ElemType &result);/出栈操作出栈操作 void GetTop(ElemType &result); /取栈顶元素取栈顶元素;一般将数组的一般将数组的0下标单元作为栈底,将栈顶元素的下标存下标单元作为栈底,将栈顶元素的下标存储在栈顶指针储在栈顶指针top中,它随着元素进栈出栈而变化。中,它随着元素进栈出栈而变化。top为为-1表示空栈,表示空栈,top等于等于stacksize-1则表示栈满。则表示栈满。 (1 1)进
4、栈操作)进栈操作若栈不满,则在栈顶插入元素若栈不满,则在栈顶插入元素x x作为新的栈顶。作为新的栈顶。void SqStack:Push(ElemType x)if( top stacksize-1) top+;datatop=x;else cout -1) result= datatop;top-; else cout -1) result= datatop;else coutdata=x;p-next=top;top=p;(2 2)出栈操作)出栈操作若栈不空,则删除栈顶元素,用若栈不空,则删除栈顶元素,用result返回其值。返回其值。void LinkStack:Pop(ElemType
5、 &result);SNode *p;if(top!=NULL)result = top-data;p=top;top=top-next;delete p;举例举例 : 后缀表达式求值后缀表达式求值假定表达式是由加减乘除和数字构成。最简假定表达式是由加减乘除和数字构成。最简单的表达式为下列形式:单的表达式为下列形式: ( (操作数操作数S S1 1)()(运算符运算符OPOP)()(操作数操作数S S2 2) ) 三种不同的表示方法:三种不同的表示方法:前缀表示法前缀表示法 OPOPS S1 1S S2 2 例如例如6+36+3写成写成+63+63中缀表示法中缀表示法 OPS OPS1 1S
6、S2 2 例如例如6+36+3写成写成63+63+后缀表示法后缀表示法 S S1 1S S2 2OPOP 例如例如6+36+3写成写成63+63+同时,任何表达式都可分解为下列形式:同时,任何表达式都可分解为下列形式: ( (子表达式子表达式E E1 1)()(运算符运算符OPOP)()(子表达式子表达式E E2 2) )它的后缀表示法应写成:它的后缀表示法应写成:(E(E1 1的后缀表示的后缀表示)(E)(E2 2的后缀表示的后缀表示) )OPOP只要不断对子表达式进一步分解,总能将子表只要不断对子表达式进一步分解,总能将子表达式分解为最简单形式,因此任何四则运算表达式分解为最简单形式,因此
7、任何四则运算表达式都可写成前缀式或后缀式。达式都可写成前缀式或后缀式。例如:例如: 2 2* *(6+3)(6+3) 2 2(6+3)(6+3)* * 2 263+63+* *。 ( (注意:转化为后缀式后括号去掉注意:转化为后缀式后括号去掉) )中缀式虽然容易理解,但在求值的时候利中缀式虽然容易理解,但在求值的时候利用前缀式或后缀式更为简单。用后缀式求用前缀式或后缀式更为简单。用后缀式求值的算法为:值的算法为:例如后缀式例如后缀式263+263+* *的计算过程为的计算过程为2 2、6 6、3 3依依次入栈,读次入栈,读+ +号则令号则令3 3和和6 6依次出栈,计算依次出栈,计算6+36+
8、3后将结果后将结果9 9入栈,读入栈,读* *号则令号则令9 9和和2 2依次依次出栈,计算出栈,计算2 2* *9 9后将结果后将结果1818入栈。这时入栈。这时1818就是最终结果。就是最终结果。【例例2-32-3】假定表达式是由不超过假定表达式是由不超过四个实四个实数进行四则数进行四则运算构成的算式,运算构成的算式,要编写一个要编写一个程序来求解该算式的结果程序来求解该算式的结果。 中缀表达式变成等价的后缀表达式中缀表达式变成等价的后缀表达式将中缀表达式变成等价的后缀表达式,表达式中将中缀表达式变成等价的后缀表达式,表达式中操作数次序不变,运算符次序发生变化,同时去操作数次序不变,运算符
9、次序发生变化,同时去掉了圆括号。转换规则是:掉了圆括号。转换规则是:步步骤骤栈中元素栈中元素 输出结果输出结果 说明说明1( (进栈(进栈2(1输出输出13( +1+进栈进栈4( +1 2输出输出25 1 2 +退栈输出,退退栈输出,退栈到(止栈到(止6*1 2 +*进栈进栈7* (1 2 +(进栈(进栈8* ( (1 2 +(进栈(进栈9* ( (1 2 + 8输出输出810* ( ( -1 2 + 8 - 进栈进栈将中缀表达式将中缀表达式(1+2)(1+2)* *(8-2)/(7-4)(8-2)/(7-4)变成等价的后缀表达变成等价的后缀表达式。式。 现在用栈来实现该运算,栈的变化及输出结
10、果如下:现在用栈来实现该运算,栈的变化及输出结果如下:11* ( ( -1 2 + 8 2输出输出212* (1 2 + 8 2 -退栈输出,退退栈输出,退栈到(止栈到(止13* ( /1 2 + 8 2 -/ 进栈进栈14* ( / (1 2 + 8 2 -( 进栈进栈15* ( / (1 2 + 8 2 - 7输出输出716* ( / ( -1 2 + 8 2 - 7- 进栈进栈17* ( / ( -1 2 + 8 2 - 7 4输出输出418* ( /1 2 + 8 2 - 7 4 -退栈输出,退退栈输出,退栈到(止栈到(止19*1 2 + 8 2 - 7 4 - /退栈输出,退退栈输出
11、,退栈到(止栈到(止20 1 2 + 8 2 - 7 4 - / * *退栈并输出退栈并输出队列定义队列定义 队列是只能在表的一端进行插入、在另一队列是只能在表的一端进行插入、在另一端进行删除操作的线性表。允许删除元素的一端进行删除操作的线性表。允许删除元素的一端称为队头,允许插入元素的一端称为队尾。端称为队头,允许插入元素的一端称为队尾。显然不论元素按何种顺序进入队列,也必显然不论元素按何种顺序进入队列,也必然按这种顺序出队列,所以队列又称为先进先然按这种顺序出队列,所以队列又称为先进先出(出(FIFOFIFO)表。队列有两个活动端,所以设置)表。队列有两个活动端,所以设置了对头和队尾两个位
12、置指针。一般队头指针记了对头和队尾两个位置指针。一般队头指针记作作frontfront,队尾指针记作,队尾指针记作rearrear。 abcfrontrear入队入队出队出队队列示意图队列示意图循环队列循环队列队列顺序存储队列顺序存储 顺序存储的队列中,每次出队列的元顺序存储的队列中,每次出队列的元素必定是队头元素,因此如果采取与普素必定是队头元素,因此如果采取与普通顺序表同样的操作方式,则每次出队通顺序表同样的操作方式,则每次出队操作必然将整个队列向前移动,这使得操作必然将整个队列向前移动,这使得效率大大降低。效率大大降低。因此因此 为方便起见,这里规定队头指针为方便起见,这里规定队头指针f
13、ront指向队头元素的前一个位置,队尾指针指向队头元素的前一个位置,队尾指针rear指向队尾元素所在位置。这样,入指向队尾元素所在位置。这样,入队和出队操作的执行步骤都是首先执行队和出队操作的执行步骤都是首先执行指针移动,再进行元素读写。指针移动,再进行元素读写。对空队列而言,可假定对空队列而言,可假定front和和rear的的值为值为-1 假溢出假溢出ABCfrontrearfrontrear (a) A B C入入队队 (b) A B出队出队, D E入入队队 (c)队列假溢出队列假溢出队列假溢出示意图CDEfrontrear 随着元素不断入队列、出队列,随着元素不断入队列、出队列,rea
14、r和和front指针会指针会不断向后移动(如图不断向后移动(如图(b)所示),最终会指向数组的最所示),最终会指向数组的最大下标位置(如图大下标位置(如图(c)所示)。由于所示)。由于rear和和front指针只指针只能单方向移动,这时元素无法入队列,但是队列中仍有能单方向移动,这时元素无法入队列,但是队列中仍有大量空闲位置。这种情况称为假溢出。大量空闲位置。这种情况称为假溢出。 循环队列循环队列解决队列假溢出的办法是将存放队列元素的数组解决队列假溢出的办法是将存放队列元素的数组首尾相接,形成循环队列。首尾相接,形成循环队列。 为了将队空和对满的条件加以区分,一般不使为了将队空和对满的条件加以
15、区分,一般不使用用front指针所指的位置。指针所指的位置。队空条件为队空条件为front=rear队满条件为队满条件为(rear+1)%M=front30124567frontrearABCD30124567frontrear30124567frontrearABCDFGE (a)(a)循环队列空循环队列空 (b) (b)非空循环队列非空循环队列 (c) (c)循环队列满循环队列满 循环队列示意图循环队列示意图 循环队列描述如下:循环队列描述如下:#define MAXSIZE 100/队列最大可分配空间数量队列最大可分配空间数量class SqQueuepublic: ElemType d
16、ataMAXSIZE;/ 存放元素的数组存放元素的数组 int front; / 队头指针队头指针 int rear; / 队尾指针队尾指针 void EnQueue(ElemType x); /入队操作入队操作 void DeQueue(ElemType &e); /出队操作出队操作 void GetHead(ElemType &e); /取队头元素取队头元素; front和和rear指针取值均为所指数组单元的下标。指针取值均为所指数组单元的下标。 由于队头指针所指单元总是空的,由于队头指针所指单元总是空的,length比实际能存储比实际能存储的元素多一。的元素多一。 (1)入队操作)入队操
17、作若队列不满,则在队尾插入元素若队列不满,则在队尾插入元素x作为新的队尾。作为新的队尾。void SqQueue:EnQueue(ElemType x) if(rear+1)% MAXSIZE= front) cout队列已满队列已满;else rear = (rear+1)%MAXSIZE;datarear=x; 常用算法常用算法 (2)出队操作)出队操作 若队列不空,则删除队头元素并用若队列不空,则删除队头元素并用e取回该元素取回该元素的值。的值。void SqQueue:DeQueue(ElemType &e) if(rear=front) cout队列已空队列已空;else front
18、 = (front +1)% MAXSIZE;e= datafront;(3)取队头元素)取队头元素 若队列不空,则用若队列不空,则用e取回队头元素的值。取回队头元素的值。void SqQueue:GetHead(ElemType &e)if(rear=front) coutnext=NULL; rear = front;/尾指针也指向头结点尾指针也指向头结点 int Length(); /求队列长度求队列长度void EnQueue(ElemType x); /入队操作入队操作void DeQueue (ElemType &e); /出队操作出队操作void GetHead(ElemType
19、 &e); /求队头元素求队头元素;(1 1)求队列的长度)求队列的长度返回队列的元素个数,即队列的长度。返回队列的元素个数,即队列的长度。 int LinkQueue:Length() QNode * p=front;int len=0;while(p!=rear)len+;p= p-next;return len;(2 2)入队列操作)入队列操作 插入元素插入元素x为队列新的队尾元素。为队列新的队尾元素。 void LinkQueue:EnQueue(ElemType x) QNode *s=new QNode;/建立新结点建立新结点s s-data = x; s-next =NULL; rear -next = s;/在队尾插入结点在队尾插入结点s rear = s;/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采购部门人员管理制度
- 采购钢材责任制度
- 采购需求制度
- 采购预算编制制度
- 采购验收标准及制度模板
- 量贩ktv采购制度
- 钢铁原料采购物流管理制度
- 人教数学三年级上册期末常考、易错题能力冲刺检测卷(有答案)
- 基于二硒化钼的智能视觉感知技术研究
- 第7章《相交线与平行线》同步单元基础与培优高分必刷卷 学生版-人教版(2024)七下
- 《植物生产与环境》考试复习题库
- 【八年级上册地理】一课一练2.2 世界的气候类型 同步练习
- 大学生魅力讲话实操学习通超星期末考试答案章节答案2024年
- 《游园》课件统编版高中语文必修下册
- DB46 T 192-2010 麒麟菜栽培技术规程
- 【盒马鲜生冷供应链物流成本现状、问题及优化建议探析11000字(论文)】
- HG/T 22820-2024 化工安全仪表系统工程设计规范(正式版)
- 基于人工智能的文化遗产保护与传承策略
- 《做个诚实的孩子》课件
- 2022年上海市养老服务综合统计监测报告
- 生物工程设备课件
评论
0/150
提交评论