三章栈与队列.ppt
《三章栈与队列.ppt》由会员分享,可在线阅读,更多相关《三章栈与队列.ppt(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、三章栈与队列 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望3.1 栈的基本概念栈是一种特殊的线性表,是操作受限的线性表,只能在表尾进行插入或删除操作。表首栈顶表尾栈底不含元素的空表称空栈特点先进后出(FILO)后进先出(LIFO)栈栈S=(a1,a2,an)ana1a2.栈底栈底栈顶栈顶.出栈出栈进栈进栈栈的基本运算Empty()判断栈空Full()判断栈满Top()返回栈顶元素Push(x)将元素x入栈Pop(x)出栈,并将栈顶元素存入x中栈的应用举例表达式或
2、字符串的括号匹配表达式或字符串的括号匹配问题问题算算术术表达式表达式(x*(x+y)-z)(x*(x+y)-z)算术表达式(x+y)*z)(x+y)*z)(对对于于给给定表达式,从左到右逐字定表达式,从左到右逐字扫扫描,每个右括描,每个右括号和距他最近的没有配号和距他最近的没有配对对的左括号匹配。的左括号匹配。将所有左括号依次放入将所有左括号依次放入栈栈中,遇到右括号,就与中,遇到右括号,就与栈顶栈顶的左括号配的左括号配对对,并将左括号出,并将左括号出栈栈,若最后,若最后栈栈空,空,则则匹匹配,若配,若栈栈不不为为空,空,则则不匹配。不匹配。top=-1123450栈空栈空栈顶指针栈顶指针to
3、p,指向实际栈顶指向实际栈顶后的空位置,初值为后的空位置,初值为-1top123450进栈进栈Atop出栈出栈栈满栈满BCDEF设数组维数为设数组维数为Mtop=-1,栈空,此时出栈,则下溢(栈空,此时出栈,则下溢(underflow)top=M-1,栈满,此时入栈,则上溢(栈满,此时入栈,则上溢(overflow)toptoptoptoptop123450ABCDEFtoptoptoptoptoptop栈空栈空3.2 用数组实现栈利用继承派生栈类templateclass Stack:private list/利用list类派生栈类 public:Stack(int mx=10):list(
4、)max=mx;bool Empty()const return list():empty();bool Full()const return size()=max;T Top()constreturn back();Stack&Push(const T&x)push_back(x);return*this;Stack&Pop(T&x)pop_back(x);treturn*this;pivate:int max;用数组实现栈基类定义templateclass Stack public:Stack(int Max=10);Stack()delete stack;bool Empty()cons
5、t return top=-1;bool Full()const return top=MaxTop;T Top()const;Stack&Push(const T&x);Stack&Pop(T&x);private:int top;/栈的栈顶元素所在数组分量的下标 int MaxTop;/数组能容纳的栈元素的最大个数 T*stack;/栈元素数组 ;构造函数构造函数构造一个空栈templateStack:Stack(int Max)MaxTop=max-1;Stack=new TMax;Top=-1;取栈顶元素返回栈顶元素的值templateT Stack:Top()constIf(Empt
6、y()throw outbounds();Else return stacktop;入栈将元素x入栈templateStack&Stack:Push(const T&x)if(Full()throw NoMem();stack+top=x;return*this;/时间复杂度为O(1)出栈将栈顶元素出栈,并存入x中templateStack&Stack:Pop(T&x)if(Empty()throw OutOfBounds();x=stacktop-;return*this;/时间复杂度为O(1)栈的数组实现的优缺点优点所列的7个基本运算都可在O(1)的时间里完成,效率高。缺点为了使每个栈在算
7、法运行过程中不会溢出,通常要为每个栈预置一个较大的栈空间。另一方面,由于各个栈的实际大小在算法运行过程中不断变化。经常会发生其中一个栈满,而另一个栈空的情形,空间利用率低。两个栈共用一个数组的实现2个栈共享一个数组stack0.n利用栈底位置不变的特性,可以将2个栈的栈底分别设在数组stack的两端。然后各自向数组stack的中间伸展,如图所示。好处:提高空间利用率,减好处:提高空间利用率,减少栈发生上溢的可能性。少栈发生上溢的可能性。3.3 用指针实现栈链栈用链表作为栈的存储结构链栈结点类定义template class Stack;template class Node friend cl
8、ass Stack;private:T data;Node*next;用指针实现栈定义templateclass Stack public:Stack()top=0;/约定空栈时top=0 Stack();bool Empty()const return top=0;bool Full()const;T Top()const;Stack&Push(const T&x);Stack&Pop(T&x);private:Node*top;/指向栈顶结点的指针析构函数析构函数释放链栈中的所有空间templateStack:Stack()Node*next;While(top)next=top-next
9、;Delet top;top=next;取栈顶元素返回栈顶元素的值templateT Stack:Top()constIf(Empty()throw outbounds();Else return top-data;.栈底栈底toptopxp入栈将元素x入栈为元素x创建一个新结点,然后将新结点插入到原有的栈顶结点之前,并修改栈顶指针,使之指向新的栈顶结点。入栈将元素x入栈templateStack&Stack:Push(const T&x)if Full()throw NoMem();Node*p=new Node;p-data=x;p-next=top;top=p;return*this;/
10、时间复杂度为O(1)top .栈底栈底topp出栈返回栈顶元素的值将栈顶元素存于x中,修改原有栈顶指针指向栈顶的下一个元素,作为新的栈顶,释放原栈顶结点空间。出栈将栈顶元素出栈,并存入x中templateStack&Stack:Pop(T&x)if(Empty()throw OutOfBounds();x=top-data;Node*p=top;top=top-next;delete p;return*this;/时间复杂度为O(1)栈的应用表达式或字符串的括号匹配问题算术表达式(x*(x+y)-z)算术表达式(x+y)*z)(对于给定表达式,从左到右逐字扫描,每个右括号和距他最近的没有配对的
11、左括号匹配。将所有左括号依次放入栈中,遇到右括号,就与栈顶的左括号配对,并将左括号出栈,若最后栈空,则匹配,若栈不为空,则不匹配。括号匹配算法括号匹配算法凡出现左括弧,则进栈凡出现右括弧,首先检查栈是否空若栈空,则表明该“右括弧”多余否则和栈顶元素比较,u若相匹配,则“左括弧出栈”u否则表明不匹配表达式检验结束时,若栈空,则表明表达式中匹配正确否则表明“左括弧”有余表达式的计算表达式的三种标识方法:OP+S1+S2 为前缀表示法S1+OP+S2 为中缀表示法S1+S2+OP 为后缀表示法中缀表达式求值从左到右扫描表达式,若当前读入的是操作数,则进操作数(NS)栈,若读入的符号是运算符,应进行判
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 三章栈 队列
限制150内