数据结构—队列

队列的定义及基本算法

队列的定义

队列是一种先进先出(FIFO)的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入的一端称为队尾(rear),允许删除元素的一端称为队头(front)。

队列的基本运算

  1. 初始化队列InitQueen(Q):创建一个空的队列Q。
  2. 判队空Empty(Q):当队列为空时返回”真“值,否则返回”假“值。
  3. 入队EnQueue(Q,x):将元素x加入到队列Q的队尾,并更新队尾指针。
  4. 出队DeQueue(Q):将队头元素从队列Q中删除,并更新队头指针。
  5. 读队头元素FrontQueue(Q);返回队头的值,但不更新队头指针。

队列的存储结构

(1)队列的顺序存储。
队列的顺序存储结构又称为顺序队列,它也是利用一组地址连续的存储单元存放队列中的元素。数据结构—队列_第1张图片
   在顺序队列中,为了降低运算复杂度,元素入队时,只修改队尾指针;元素出队时,只修改队头指针。由于顺序队列的存储空间是提前设定的,因此队尾指针会有一个上限值,当队尾指针达到其上限时,就不能通过修改队尾指针来实现新元素的入队操作。此时可将顺序队列假想成一个环状结构。称之为循环队列。

设队列中的元素类型为整型,则循环队列的类型定义为:
#define MAXQSIZE  100
typedef struct{
      int *base;       //循环队列的存储空间首地址
      int front,rear;  //队头,队尾指针

}SqQueue;

(函数)创建一个空的循环队列
int InitQueue(SqQueue *Q)
//创建容量为MAXQSIZE-1的空队列,若成功则返回0;否则返回-1
{
  Q->base=(int*)malloc(MAXQSIZE *sizeof(int));
  if(!Q->base) return -1;
  Q->front=0;Q->rear =0;

}//InitQueue

(函数)元素入循环队列
int EnQueue(SqQueue *Q,int e)//元素e入队,若成功则返回0;否则返回-1
{
    if((Q->rear+1)%MAXQSIZE==Q->front) return -1;
    Q->base[Q->rear] = e;
    Q->rear=(Q->rear + 1)% MAXQSIZE;
    return 0;

}//EnQueue

(函数)元素出循环队列
int DeQueue(Squeue *Q,int e)//若队列不为空,则删除队头元素,由参数e带回其值并返回0;否则返回-1
{
   if(Q->rear==Q->front) return -1;
   *e =Q->base[Q->front];
   Q->front=(Q->front + 1)%MAXQSZIE;
   return 0;

}//DeQueue

(2)队列的链式存储。队列的连式存储也称为链队列。为了便于操作,可给链队列添加一个头结点,并令头指针指向头结点。队列为空的判断条件是头指针和尾指针的值相同,且均指向头结点。
(3)队列的应用:队列常应用于需要排队的场合,如操作系统中处理打印任务的打印队列,离散事件的计算机模拟等。

你可能感兴趣的:(数据结构,队列,线性表)