数据结构之栈和队列

  栈和队列是两种应用非常广泛的数据结构,它们都来自线性表数据结构,都是“操作受限”的线性表。

  栈的概念

  栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出LIFO (Last In First Out)或先进后出FILO (First In Last Out)线性表。

  栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。

  栈底(Bottom):是固定端,又称为表头。

     空栈:当表中没有元素时称为空栈。

  栈的抽象数据类型定义:

     ADT Stack{
    数据对象:D ={ ai|ai∈ElemSet,  i=1,2,…,n,n≥0 }
    数据关系:R ={<ai-1, ai>|ai-1,ai∈D,  i=2,3,…,n }
    基本操作:初始化、进栈、出栈、取栈顶元素等
  } ADT Stack

  栈的顺序存储结构简称为顺序栈,和线性表相类似,用一维数组来存储栈。根据数组是否可以根据需要增大,又可分为静态顺序栈和动态顺序栈。  

  • 静态顺序栈实现简单,但不能根据需要增大栈的存储空间;
  • 动态顺序栈可以根据需要增大栈的存储空间,但实现稍为复杂。

  栈的链式存储结构表示

  栈的链式存储结构称为链栈,是运算受限的单链表。其插入和删除操作只能在表头位置上进行。因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针。

  栈的常见应用实例:

  • 数值转换
  • 括号匹配判断
  • 递归调用的实现

  队列的概念

     队列(Queue):也是运算受限的线性表。是一种先进先出(First In First Out ,简称FIFO)的线性表。只允许在表的一端进行插入,而在另一端进行删除。
       队首(front) :允许进行删除的一端称为队首。
       队尾(rear) :允许进行插入的一端称为队尾。
  队列中没有元素时称为空队列。
  队列的抽象概念表示:

   ADT Queue{
    数据对象:D ={ ai|ai∈ElemSet,  i=1, 2, …, n, n >= 0 }
    数据关系:R = {<ai-1, ai> | ai-1, ai∈D,  i=2,3,…,n }
           约定a1端为队首,an端为队尾。
    基本操作:
      Create():创建一个空队列;
      EmptyQue():若队列为空,则返回true ,否则返回flase ;
      ⋯⋯
      InsertQue(x) :向队尾插入元素x;
      DeleteQue(x) :删除队首元素x;
  } ADT Queue

  队列的顺序存储结构:利用一组连续的存储单元(一维数组) 依次存放从队首到队尾的各个元素,称为顺序队列。

  队列的链式存储结构:队列的链式存储结构简称为链队列,它是限制仅在表头进行删除操作和表尾进行插入操作的单链表。
  

  为队列分配的向量空间看成为一个首尾相接的圆环,并称这种队列为循环队列(Circular Queue)


 

posted @ 2018-07-14 09:53  王小豆又叫小王子  阅读(413)  评论(0编辑  收藏  举报