《大话数据结构》第4章.栈与队列

栈与队列

栈、队列都是特殊的线性表(受限表),只不过对插入删除操作做了限制(没有修改操作),这些操作只能限制在表的一端

what栈:栈是限定仅在表尾(这里的表尾是指栈顶,而不是栈底)进行插入和删除操作的线性表
what队列:队列是只允许在表的一端进行插入操作,而在表的另一端进行删除操作的线性表

栈、队列和线性表一样,分顺序实现和链式实现


栈的 顺序实现ADT
typedef int ElemType;

class   Stack
{
public :
     
      Stack():top_(-1){}
      inline bool Empty() const;
      inline  int   Size()   const ;
      
       bool   Top(ElemType &item)   const ;
       bool   Push( const   ElemType &item);
      bool Pop();
     
private :
       static   const   int   kMaxstack=3;

       int   top_;
        ElemType entry_[kMaxstack];
};


栈的链式实现ADT
typedef int ElemType;

class   Node
{
       friend   class   LinkStack;
private :
      ElemType entry_;
      Node *next_;

public :
      Node( const   ElemType &entry,Node *next):entry_(entry),next_(next){}
};


class   LinkStack
{
private :
       int   count_;
      Node *top_node_;

public :
      LinkStack():count_(0),top_node_(NULL){}
      ~LinkStack();

      inline   bool Empty() const;
       inline    int Size()  const;
     
      bool Top(ElemType &entry) const;
       void   Push( const   ElemType &entry);
       bool   Pop();
};
  我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

栈的注意细节:
  1)它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。
  2)它的特殊之处在于限制了这个线性表的插入和删除位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。

顺序实现:
 核心思想: 下标为0的一端作为栈底,当栈存在一个元素时,top=0,而空栈时top=-1

链式实现:
 核心思想: 由于栈只是用栈顶来做插入和删除操作,所以单链表的栈顶指针也作为头指针,两者合二为一,就不需要头指针了


栈的顺序实现和栈的链式实现优劣比较:
时间性能
两者时间复杂度一样,均为O(1),无论是读取、插入还是删除。但链式实现在插入、删除时还需要分别申请节点和释放节点,若栈需要频繁插入或删除,两者还是有些细微差异。

空间:
顺序实现需要预分配,所以可能会存在空间浪费的问题;链式实现每个节点还需存储指针域,会增加一些内存开销,但对栈的长度无限制



队列
队列 顺序实现ADT

what循环队列:我们把队列的这种头尾相接的顺序存储结构称为循环队列

循环队列时间性能为O(1),避免了普通队列顺序实现只有一个top指针,出列时要移动数据元素,使得时间复杂度为O(n)

循环队列核心思想:队列满时,为只有一个元素空间时。即插入时,预留一个元素空间
如不留空间,如front==rear,则无法判断队列是处在满还是空的状态

实现技巧:
队列满的条件是(rear+1)%QueueSize==front
队列长度:(rear-front+QueueSize)%QueueSize  (rear>front时,长度=rear-front;rear



你可能感兴趣的:(数据结构与算法,数据结构,存储,null)