数据结构——队

1 队的定义

1.1 队

  只允许在一端进行插入,在另一端进行删除的操作的线性表,又称为先进先出(First In First Out)线性表,简称FIFO

1.2 队的相关概念

  队头:允许进行删除操作的一端

  队尾:允许进行插入操作的一端

  空队:不含任何数据元素的队

1.3 队的操作

  入队:在队尾添加一个元素

  

    出队:在对头删除一个元素

  

2 队的抽象数据类型

  ADT队:

  Data: 

    a1,a2,a3,...,ai-1,ai,ai+1,...,an

Operation
  initQueue(Q)  //初始化操作建立一个空队
  DestroyQueue(Q) //销毁一个已存在的队
  ClearQueue(Q)  //清空一个队
  QueueEmpty(Q)  //若队为空,返回true
                           //若队不为空,返回false
  GetQueue(Q,e)   //若队存在且为空,返回队首元素
  EnQueue(Q,e)    //若队列存在,在队尾插入一个元素
  DeQueue(Q,e)   //若队存在且为空,返回并删除队首元素
  QueueLength(Q)  //返回队列中元素个数
endADT

3 队的顺序存储结构

3.1 队的顺序存储结构的缺点

  出队效率低下

  

  出队时浪费存储空间,入队时存储空间不足

  

3.2 循环队列

  将队列首尾相接的存储结构

  

3.3 队的存储结构

#define QUEUESIZE 100
typedef int DataType
typedef struct     //结构体别名可有可无
{
  DataType data[QUEUESIZE];
  int front;
  int rear;
}SeqQueue;

3.4 队的初始化操作

#define QUEUESIZE 100
typedef int DataType
typedef struct    
{
  DataType data[QUEUESIZE];
  int front;
  int rear;
}SeqQueue;

void initQueue(SeqQueue *q)
{
  q->front=0;
  q->rear=0;
}

void main()
{
  SeqQueue sq;
  initQueue(&sq);
}

3.5 删除队中所有元素

void ClearQueue(SeqQueue *q)
{
  q->front=0;
  q->rear=0;
}

3.6 判断队是否为空

#define QUEUESIZE 100
typedef int DataType
typedef struct    
{
  DataType data[QUEUESIZE];
  int front;
  int rear;
}SeqQueue;

void initQueue(SeqQueue *q)
{
  q->front=0;
  q->rear=0;
}

bool QueueEmpty(SeqQueue *q)
{
  return q->front=q->rear;
}

void main()
{
  SeqQueue sq;
  initQueue(&sq);
  if(QueueEmpty(&sq))
    printf("Queue is empty");
  else
    printf("Queue is not empty");
}

3.7 判断队是否为满

bool QueueFull(SeqQueue *q)
{
  return q->front = (q->rear+1)%QUEUESIZE;
}

3.8 获取队头元素

bool getQueue(SeqQueue *q,DataType *e)
{
  if(QueueEmpty(&q))
    return ERROR;
  *e=q->data[q->front];
  return OK;
}

 3.9 从队列中取出一个元素

Status DeQueue(SeqQueue *q,DataType *e)
{
  if(QueueEmpty(q))
    return ERROR;
  *e=q->data[q->front];
  q->front=(q->front+1)%QUEUESIZE;
  return OK;
}

3.10 队列中添加一个元素

Status EnQueue(SeqQueue *q,DataType e)
{
  if(QueueEmpty(q))
    return ERROR;
  q->data[q->rear]=e;
  q->rear=(q->rear+1)%QUEUSIZE;
  return OK;
}

3.11 求队列的长度

int QueueLength(SeqQueue *q)
{
  return (q->rear-q->front+QUEUESIZE)%QUEUESIZE;
}

4 队的链式存储结构

4.1 队的链式存储结构

typedef int DataType;
typedef struct Qnode
{
  DataType data;
  struct Qnode *next; 
}Qnode;
typedef struct
{
  Qnode *front,*rear;
  DataType count;
}LinkQueue;

4.2 队的链式存储结构的初始化操作

void InitQueue(LinkQueue *q)
{
  if(QueueEmpty(q)==false)
    ClearQueue(q);
  else
    q->front=q->rear=NULL;
    q->count=0;
}

void main()
{
  LinkQueue lq;
  lq.front=NULL;   //如果没有这一句,程序可能崩溃;不为空可能随机赋值,即野指针
  InitQueue(&lq);
}

4.3 队列中添加一个元素

void EnQueue(LinkQueue *q)
{
  Qnode *p=(Qnode *)malloc(sizeof(Qnode));
  p->data=e;
  p->next=NULL;
  if(QueueEmpty(q))
    q->front=q->rear=NULL;
  else
  {
    q->rear->next=p;
    q->rear=p;
  }
  q->count++;
}

4.4 将队列中所有元素删除

void ClearQueue(LinkQueue *q)
{
  Qnode *p=q->front;
  while(p)
  {
    Qnode *p1=p;
    p=p->next;
    free(p1);
  }
  q->front=q->rear=NULL;
  q->count=0;
}

4.5 判断队是否为空 

bool QueueEmpty(LinkQueue *q)
{
  return q->front=NULL;
}

4.6 求队的长度

bool QueueLength(LinkQueue *q)
{
  return q->count;
}
LinkQueue lq={};
相当于:lq.front=0;lq.rear=0;lq.count=0;

4.7 获取队头元素

Status getHead(LinkQueue *q,DataType *e)
{
  if(QueueEmpty(q))
    return ERROR;
  *e=q->front->data;
  return OK;
}

4.8 队列中取出一个元素

Status DeQueue(LinkQueue *q,DataType *e)
{
  if(QueueEmpty(q))
    return ERROR;
  Qnode *p=q->front;
  *e=q->front->data;
  q->front=q->front->next;
  free(q);
  q->count--;
  return OK;
}

猜你喜欢

转载自www.cnblogs.com/dongry/p/10033501.html