数据结构 - 队列静态顺序存储结构

队列的基本概念

1 队列的基本概念

队列(Queue):也是运算受限的线性表。是一种先进先出(First In First Out ,简称FIFO)的线性表。只允许在表的一端进行插入,而在另一端进行删除。

队首(front) :允许进行删除的一端称为队首。

队尾(rear) :允许进行插入的一端称为队尾。

  例如:排队购物。操作系统中的作业排队。先进入队列的成员总是先离开队列。

队列中没有元素时称为空队列。在空队列中依次加入元素a1, a2, …, an之后,a1是队首元素,an是队尾元素。显然退出队列的次序也只能是a1, a2, …, an ,即队列的修改是依先进先出的原则进行的

队列的抽象数据类型定义

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)。

特点:

克服上述“假溢出”现象,充分利用向量空间

出队、入队操作,队首、队尾指针仍要加1,朝前移动

当队首、队尾指针指向向量上界(MAX_QUEUE_SIZE-1)时,其加1操作的结果是指向向量的下界0

2  入队操作
Status Insert_CirQueue(SqQueue  Q , ElemType  e)
  /*  将数据元素e插入到循环队列Q的队尾  */
{  if  ((Q.rear+1)%MAX_QUEUE_SIZE== Q.front)
return  ERROR;      /*  队满,返回错误标志    */
Q.Queue_array[Q.rear]=e ;   /*  元素e入队  */
Q.rear=(Q.rear+1)% MAX_QUEUE_SIZE ;
/*  队尾指针向前移动  */
return OK;        /*  入队成功    */
}
2  入队操作(正确)
Status Insert_CirQueue(SqQueue  *Q , ElemType  e)
  /*  将数据元素e插入到循环队列Q的队尾  */
{  if  ((Q->rear+1)%MAX_QUEUE_SIZE== Q-> front)
return  ERROR;      /*  队满,返回错误标志    */
Q-> Queue_array[Q-> rear]=e ;   /*  元素e入队  */
Q-> rear=(Q-> rear+1)% MAX_QUEUE_SIZE ;
/*  队尾指针向前移动  */
return OK;        /*  入队成功    */
}
3  出队操作
Status Delete_CirQueue(SqQueue  Q, ElemType  *x )
   /*  将循环队列Q的队首元素出队  */
{   if  (Q.front== Q.rear)
return ERROR ;       /*  队空,返回错误标志    */
*x=Q.Queue_array[Q.front] ;  /* 取队首元素 */
Q.front=(Q.front+1)% MAX_QUEUE_SIZE ;
     /*  队首指针向前移动  */
return OK ;
}
3  出队操作(正确)
Status Delete_CirQueue(SqQueue  *Q, ElemType  *x )
   /*  将循环队列Q的队首元素出队  */
{   if  (Q-> front== Q-> rear)
return ERROR ;       /*  队空,返回错误标志    */
*x= Q-> Queue_array[Q-> front] ;  /* 取队首元素 */
Q-> front=(Q-> front+1)% MAX_QUEUE_SIZE ;
     /*  队首指针向前移动  */
return OK ;
}
时间: 2024-10-30 21:20:21

数据结构 - 队列静态顺序存储结构的相关文章

队列的顺序存储结构和链式存储结构

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(在队尾进行插入操作,在对头进行删除操作). 与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表. 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础. 队列的链式存储结构 队列既可以用链表实现,也可以用顺序表实现.跟栈相反的是,栈一般我们用顺序表来实现,而队列我们常用链表来实现,简称为链队列. typedef struct QNode { ElemT

队列(顺序存储结构)

队列:具有一定操作约束的线性表,只能在一端作插入.删除,与堆栈类似 具有先入先出的特性(First In First Out) 同理,分顺序存储结构.链式存储结构两种形式 队列(顺序存储结构) 通常由一个一维数组和一个队列头元素变量front和一个队列尾元素变量rear组成 加入一个元素rear加1,删除一个元素front加1 空的时候front=rear,但是填满时front/rear也相等,这时便不利于区分:为此通常采用加1求余的方式,同时构成循环队列 1)判断是否为空:front == r

数据结构:队列的顺序存储结构【转】

本文转载自:http://blog.csdn.net/jnu_simba/article/details/8841657 队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.是一种先进先出的线性表(FIFO).允许插入的一端称为队尾,允许删除的一端称为队头.我们在<栈的顺序存储结构>中发现,栈操作的top指针在Push时增大而在Pop时减小,栈空间是可以重复利用的,而队列的front.rear指针都在一直增大,虽然前面的元素已经出队了,但它所占的存储空间却不能重复利用

队列的顺序存储结构

还是直接上代码 package com.sbtufss.test; import java.util.Arrays; /** * 所谓的顺序存储结构,实际上就是用数组来存储队列的元素 * @author sbtufss * */ public class ArrayQueue<T> { private int tLenght=3;//数组的大小,或者每次增加的大小 //初始化能存放tLenght个元素的数组 private Object[] t=new Object[tLenght]; pri

数据结构(03)_顺序存储结构线性表

本节我们基于前面实现的数据结构类模板基础,继续完成基于顺序存储结构的线性表的实现,话不多说,继承关系图如下: 14.线性表的本质和操作 14.1.线性表的表现形式 零个多多个数据元素组成的集合 数据元素在位置上是有序排列的 数据元素的个数是有限的 数据元素的类型必须相同 14.2.线性表的抽象定义.性质 线性表是具有相同类型的n(>=)个数据元素的有限序列,(a0, a1, a2... an-1),其中ai是表项,n是表长度.性质: a0为线性表的第一个元素,只有一个后继 an-1为线性表的最后

数据结构——线性表顺序存储结构

 关于线性表 线性表是零个或者多个数据元素的集合.它主要有以下三个特征: 1:线性表的数据元素之间是有顺序的. 2:线性表中数据元素个数是有限的. 3:线性表中数据元素数据类型是相同的. 关于线性表的操作,主要有 创建线性表.销毁线性表.清空线性表.将元素插入线性表.将元素从线性表中删除.获取线性表中某个位置的元素.获取线性表的长度. 线性表主要有两种存储结构: 1:线性表的顺序存储结构,c语言中的数组及采用这种方式. 2:线性表的链式存储结构. 关于顺序存储结构 定义: 是指用一段地址连续的内

数据结构 - 线性表顺序存储结构

线性表 线性表是一种典型的线性结构.其基本特点是线性表中的数据元素是有序且是有限的.在这种结构中: ① 存在一个唯一的被称为"第一个"的数据元素: ② 存在一个唯一的被称为"最后一个"的数据元素: ③ 除第一个元素外,每个元素均有唯一一个直接前驱: ④ 除最后一个元素外,每个元素均有唯一一个直接后继. 线性表(Linear List) :是由n(n≧0)个数据元素(结点)a1,a2, -an组成的有限序列.该序列中的所有结点具有相同的数据类型. 线性表中的数据元素

数据结构|-完全二叉树的顺序存储结构的实现

对于一个完全二叉树,假设它有n个结点,对结点进行从1开始编号,对任一结点i满足下面 它的双亲是结点 i/2 (除了i=1的情况) 左孩子是 2i 右孩子是 2i+1 如果2i>n 说明无左孩子 2i+1>n 说明无右孩子 一般的树来说是一对多的关系,使用顺序结构存储起来比较困难,但是二叉树是一种特殊的树,每个结点最多有两个子节点,并且子节点有左右之分,并且兄弟,父亲,孩子可以很方便的通过编号得到,所以我们使用顺序存储结构使用二叉树的存储. using System; using System.

队列的顺序存储结构(循环队列)(C语言实现)

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define OK 1 5 #define ERR 2 6 #define TRUE 1 7 #define FALSE 0 8 #define MAXSIZE 4 //定义队列的最大长度 9 10 typedef int status; //定义函数返回的状态,OK & ERR 11 typedef char datatype; //定义队列中每个元素的数据类型,这里暂定为字符