DS04_堆栈与队列1.ppt
文本预览下载声明
SIE. BIT 多栈共享空间问题 考虑多栈共享一个大的内存空间,要解决相应产生的问题。 设将多个堆栈顺序地映射到一个已知大小为m的存储空间STACK[m]上。 SIE. BIT 多栈共享空间问题 1、 两个堆栈共享该存储空间:第一个栈底位于STACK[0],另一个栈底位于STACK [m-1]。使用时两栈各自向中间伸展,仅当两个栈顶指针相遇(S1. top == S2. top)时才发生上溢。 a S1[0] b S1[1] c S1[2] 4 S2[3] 3 S2[2] 2 S2[1] 1 S2[0] STACK[0] STACK[m-1] S1.top S2.top SIE. BIT 2、两个以上堆栈共享该存储空间(大小为m): 将m个存储空间平均分配给n个栈,每个栈的存储空间为m/n。 设top[n]为n个堆栈的栈顶指针集合,top[i]为第i个堆栈的栈顶指针,bot[i]为第i个堆栈的栈底指针。另设bot[n+1]为n+1个栈底指针集合。其中第n+1个堆栈是虚设的,目的是为了检测第n个栈栈满与否。 多栈共享空间问题 SIE. BIT 初始时, bot[i]=top[i]=i*(m/n) (0=i=n-1) bot[n]=m 当m=15,n=5时: 各元素陆续进栈后: 0 3 6 9 12 15 m-1 bot[0] top[0] bot[1] top[1] bot[2] top[2] bot[3] top[3] bot[4] top[4] bot[5] a b c 1 d1 d2 gg 0 3 6 9 12 15 m-1 bot[0] top[1] bot[2] bot[3] top[3] bot[4] bot[5] top[4] top[2] bot[1] top[0] SIE. BIT 第i个堆栈“栈空”的条件是 top[i]==bot[i],(0=i=n-1) 第i个堆栈“栈满”的条件是 top[i]==bot[i+1] (0=i=n-1) 多栈共享空间经过扩展,还可以节省空间,但往往要移动大量的数据元素。 SIE. BIT 链式栈的定义 链式栈类的定义 链栈中典型成员函数的实现 链式栈 SIE. BIT 链式栈的定义 链式栈就是用一个线性链表来实现一个堆栈结构。栈中每个元素用一个链结点表示,同时,设置一个指针变量,指出当前栈顶元素所在结点的存储位置,当栈为空时,有top==NULL,下图就是链接栈的一般形式: 不带头节点的链表 SIE. BIT 链栈的特点 链表的第一个结点就是栈顶元素的结点; 根据堆栈的定义,新结点的插入和栈顶结点的删除都在表头进行 ; 插入一个新元素,相当于在第一个结点之前插入一个新结点; 删除链接栈的栈顶元素,就是删除链表的第一个结点。 不会有栈满而产生溢出的问题。 SIE. BIT 链式栈类的定义 定义一个结点结构: templateclass type struct StackNode //定义一个结点模板-结构 { type data; //结点的数据元素值 StackNode *next; //指向下一结点的指针 }; SIE. BIT 链式栈类的定义:链栈模板 templateclass type //定义一个栈类模板 class LinkStack: public abstacktype { protected: StackNodetype*top; //栈顶指针 //复制函数,将堆栈g复制给本链式栈 LinkStack Copy(LinkStack g); public: LinkStack( ); //无参构造函数 LinkStack(LinkStack g) //拷贝构造函数 { top=NULL; Copy(g); } SIE. BIT ~ LinkStack( ) //析构函数,调用Clear( )函数释放内存空间 { Clear( ); } void Clear( ); //清空当前栈中元素 void Push(type x); //进栈函数 bool Pop(type x); //出栈函数 //重载赋值运算符,用于同类型栈对象的赋值 LinkStack operator=(LinkStack g) { Copy(g); r
显示全部