软件基础-3栈.ppt





《软件基础-3栈.ppt》由会员分享,可在线阅读,更多相关《软件基础-3栈.ppt(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第二二章章 线线性性结结构构一、栈的定义和运算一、栈的定义和运算二、顺序栈二、顺序栈三、链栈三、链栈四、栈的四、栈的应用应用五、小结五、小结第第 2 2 节节 栈栈1第第二二章章 线线性性表表2.2 2.2 栈栈 一、栈的概念和运算一、栈的概念和运算1.1.栈的定义栈的定义 栈是限定栈是限定只能在表的一端只能在表的一端进行插入和删除操作的线性表。进行插入和删除操作的线性表。允许插入和删除的一端称为允许插入和删除的一端称为栈顶栈顶(toptop),另一端称为另一端称为栈底栈底(bottombottom)。设栈设栈s=(as=(a1 1,a,a2 2,.,a,.,an n),a a1 1称为称为
2、栈底元素栈底元素,a an n称为称为栈顶元素栈顶元素。栈中元素按栈中元素按a a1 1,a,a2 2,.,a,.,an n次序进栈,又按次序进栈,又按a an n,.,a,.,a2 2,a,a1 1次序次序退栈。因此栈的操作特点是:退栈。因此栈的操作特点是:后进先出后进先出(LIFOLIFO)或或先进后出先进后出(FILOFILO););n=0 n=0时称为时称为空栈空栈。2第第二二章章 线线性性表表2.2 2.2 栈栈 一、栈的概念和运算一、栈的概念和运算2.2.栈的存储栈的存储 栈的顺序存储顺序栈栈的顺序存储顺序栈ana1a2.栈底栈底栈顶栈顶.出栈出栈进栈进栈栈栈s=(a1,a2,an
3、)栈的链式存储链栈栈的链式存储链栈用用指指针针来来实实现现的的栈栈叫叫链链栈栈。栈栈的的容容量量事事先先不不能能估估计计时采用这种存储结构。时采用这种存储结构。3第第二二章章 线线性性表表2.2 2.2 栈栈 一、栈的概念和运算一、栈的概念和运算3.3.栈的基本运算栈的基本运算 栈的初始化栈的初始化 判栈空判栈空 EmptyEmpty 入栈入栈 PushPush 出栈出栈 PopPop 读栈顶元素读栈顶元素4top=0123450栈空栈空栈顶指针栈顶指针top,指向指向实际栈顶实际栈顶后的空后的空位置,初值为位置,初值为0top123450进栈进栈Atop出栈出栈栈满栈满BCDEF设一维数组长
4、度为设一维数组长度为Mtop=0,栈空,此时出栈,则栈空,此时出栈,则下溢下溢(underflow)top=M,栈满,此时入栈,则栈满,此时入栈,则上溢上溢(overflow)toptoptoptoptop123450ABCDEFtoptoptoptoptoptop栈空栈空2.2 2.2 栈栈 二、顺序栈二、顺序栈 (实现:一维数组实现:一维数组sM)52.2 2.2 栈栈 二、顺序栈二、顺序栈1.1.栈结构栈结构typedef structtypedef struct datatype dataMAX;datatype dataMAX;int top;int top;SeqStack;Seq
5、Stack;创建一个栈:创建一个栈:SeqStack *s;SeqStack *s;62.2 2.2 栈栈 二、顺序栈二、顺序栈2.2.栈的初始化栈的初始化SeqStack *StackList()SeqStack *StackList()/构造一个空栈构造一个空栈 SeqStack *s;SeqStack *s;s=(SeqStack*)malloc(sizeof(SeqStack);s=(SeqStack*)malloc(sizeof(SeqStack);s-top=0;s-top=0;/约定约定toptop始终指向新数据元素将存放的位置始终指向新数据元素将存放的位置 return s;r
6、eturn s;72.2 2.2 栈栈 二、顺序栈二、顺序栈3.3.判栈空判栈空int Empty(SeqStack *s)int Empty(SeqStack *s)if(s-top=0)return 1;if(s-top=0)return 1;/栈空栈空,返回返回 else return 0;else return 0;/栈非空栈非空,返回返回 82.2 2.2 栈栈 二、顺序栈二、顺序栈4.4.入栈入栈int Push(SeqStack *s,datatype x)int Push(SeqStack *s,datatype x)if(s-top=Max)return 0;if(s-top
7、=Max)return 0;/栈满栈满,返回返回 else else s-datas-top=x;s-datas-top=x;/x/x值入栈值入栈 s-top+;s-top+;/指示器加指示器加1 1 return 1;return 1;/成功,返回成功,返回 92.2 2.2 栈栈 二、顺序栈二、顺序栈.出栈且读栈顶元素出栈且读栈顶元素int Pop(SeqStack *s,datatype*x)int Pop(SeqStack *s,datatype*x)if(Empty(s)return 0;if(Empty(s)return 0;/栈空栈空,返回返回 else else s-top-;
8、s-top-;/指示器减指示器减1 1 *x=s-datas-top;*x=s-datas-top;/出栈出栈 return 1;return 1;/成功,返回成功,返回 102.2 2.2 栈栈 三、链栈三、链栈toptop问题?问题?若若top指向最后一个元素,则入栈和出栈操作时指向最后一个元素,则入栈和出栈操作时top的值都要变化,在的值都要变化,在C中参数传值方式难实现!中参数传值方式难实现!解决办法:解决办法:用增加头结点方式用增加头结点方式栈顶栈顶a1 .topan栈底栈底top头结点头结点next112.2 2.2 栈栈 三、链栈三、链栈.结点定义结点定义typedef stru
9、ct Node datatype data;struct Node *next;StackNode;栈顶栈顶a1 .topan栈底栈底top头结点头结点栈空栈空:若有头结点时若有头结点时top-next=Null为空栈;为空栈;若无头结点时若无头结点时top=Null为空栈为空栈 建立一个链栈:建立一个链栈:StackNode*top;如何判栈空?如何判栈空?头结点头结点next122.2 2.2 栈栈 三、链栈三、链栈2.2.链栈初始化链栈初始化StackNode*Creat()StackNode *top;/创建头结点创建头结点 top=(StackNode*)malloc(sizeof(
10、StackNode);top-next=Null;/设置头结点设置头结点 return top;/返回头指针返回头指针Nulltop132.2 2.2 栈栈 三、链栈三、链栈3.3.入栈头插法入栈头插法void Push(StackNode*s,datatype x)StackNode *p;/创建一个新结点创建一个新结点p p p=(StackNode*)malloc(sizeof(StackNode);p-data=x;/设置设置p p结点结点 p-next=s-next;/p/p结点加入链栈中结点加入链栈中 s-next=p;/头结点头结点nextnext指向新的栈顶结点指向新的栈顶结点
11、p ppxStackNode *p;p=(StackNode*)malloc(sizeof(StackNode);p-data=x;p-next=s-next;s-next=p;sa1Nulla2ai头结点头结点142.2 2.2 栈栈 三、链栈三、链栈.出栈出栈int Pop(StackNode*s,datatype *x)StackNode *p;/创建一个新结点创建一个新结点p p if(s-next=Null)return 0;/栈空,返回失败栈空,返回失败 *x=s-next-data;/传回栈顶结点的数据传回栈顶结点的数据 p=s-next;/p/p结点指向栈顶结点结点指向栈顶结点
12、 s-next=p-next;/头结点头结点nextnext域指向域指向p p下一个结点下一个结点 free(p);/释放释放p p结点删除栈顶结点结点删除栈顶结点 return 1;/返回成功返回成功152.2 2.2 栈栈 四、栈的应用四、栈的应用 数制转换数制转换 函数的递归调用函数的递归调用 表达式求值表达式求值 迷宫求解迷宫求解16 数制转换数制转换例例 把十进制数把十进制数159转换成八进制数转换成八进制数(159)10=(237)815981982802 3 7 余余 7余余 3余余 2toptop7top73top7322.2 2.2 栈栈 算法见书第55页,自学172.22.
13、2栈栈 表达式求值表达式求值 1.高级语言中的表达式是用人们熟悉的公式形式书写的,高级语言中的表达式是用人们熟悉的公式形式书写的,如:如:a+b*c-d 中缀表达式中缀表达式为解决运算顺序问题把运算符分成若干等级级别高的先运算。为解决运算顺序问题把运算符分成若干等级级别高的先运算。.后缀表达式后缀表达式(也称逆波兰表达式(也称逆波兰表达式RPN)如:如:abc*+d-运算符在运算对象的后面,无需判断运算符优先级,遇到运算运算符在运算对象的后面,无需判断运算符优先级,遇到运算符就计算运算对象,简单方便。符就计算运算对象,简单方便。182.2.栈栈.中缀表达式求值中缀表达式求值 为解决运算顺序问题
14、把运算符分成若干等级,称为优先数。为解决运算顺序问题把运算符分成若干等级,称为优先数。运算符:运算符:*/*+-()界限符:界限符:;优先级:优先级:4 3 3 2 2 1 1 0输入:表达式符号序列输入:表达式符号序列输出:表达式值输出:表达式值 y为进行表达式的翻译,为进行表达式的翻译,需设立两个栈需设立两个栈,分别存放,分别存放操作数操作数(NS)NS)和运算符和运算符(OS)OS),初始化栈初始化栈 NS、OS:在在OSOS中放入表达式结束符中放入表达式结束符“;”。191.1.中缀表达式求值中缀表达式求值 A*B+C/D;自左至右扫描表达式,对扫描的每个符号自左至右扫描表达式,对扫描
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 基础

限制150内