队列

队列

定义

队列简称,是一种只允许在表的一端进行插入操作,而在表的另一端进行删除操作的线性表。允许插入的一端称为队尾,队尾元素的位置由rear指出;允许删除的一端称为队头, 队头元素的位置由front指出。如下图

队列的基本操作

1、队列的插入(进队、入队)
2、队列的删除(出队、退队)
3、测试队列是否为空
4、检索当前队头元素
5、创建一个空队

队列的顺序存储结构和操作

1、构造原理
在实际程序设计过程中,通常借助一个一维数组QUEUE[0: M–1]来描述队列的顺序存储结构,同时,设置两个变量front与rear分别指出当前队头元素与队尾元素的位置。如下图

C语言实现如下:

#define M 1000
QElemType QUEUE[M];
int front, rear;

2、初始化队列

void INITIALQ( int front, int rear ) {
    front= –1;
    rear= –1;
}

3、测试队列是否为空

int EMPTYQ( int front,int rear ){
    return front==rear;
}

4、插入(进队)算法

int ADDQ( QElemType QUEUE[], int rear, int item ){
    if (rear==M-1)      /* 队列满,插入失败*/
        return 0;
    else {
        QUEUE[++rear]=item;
        return 1;           /* 队列未满,插入成功*/
    }
}

5、删除(出队)算法

int DELQ( QElemType QUEUE[], int front, int rear, QElemType item ){
    if ( EMPTYQ(front,rear) )
        return 0;           /* 队列为空,删除失败*/
    else {
         item=QUEUE[++front];
         return 1;          /* 队列非空,删除成功*/
     }
 }

队列的链式存储结构和操作

1、构造原理
队列的链式存储结构是用一个线性链表表示一个队列,指针front 与rear分别指向实际队头元素与实际队尾元素所在的链结点。如下图

C语言实现如下

typedef struct node { 
     QElmeType data;
     struct node *link;
} QNode, *QLink;

2、初始化队列

void INITIALQ( QLink front, QLink rear ){
    front=NULL;
    rear=NULL;
}

3、测试队列是否为空

int EMPTYQ( QLink front ){
     return front==NULL;
}

4、插入(进队)算法

#define LEN sizeof(QNode)
int ADDLINKQ( QLink front, QLink rear, QElemType item ){ 
     QLink p;
     if(!(p=(Qlink)malloc(LEN))        /* 申请链结点*/
          return 0;
      p->data=item;
      p->link=NULL;
      if (front ==NULL) 
           front=p;                /* 插入空队的情况*/
       else
           rear->link=p;         /* 插入非空队的情况*/
       rear=p;
       return 1; 
}

5、删除(出队)算法

int DELLINKQ( QLink front, QLink rear, QElemType item ){ 
    Qlink p;
    if ( EMPTYQ(front) ) 
        return 0;              /* 队列为空,删除失败*/
    else {
        p=front;
        front=front->link;
        item=p->data;
        free(p); 
        return 1;             /* 队列非空,删除成功*/
    }
}

6、销毁一个队列

void DESLINKQ(QLink front, QLink rear){
    while(front){            /* 队列非空时*/
         rear=front->link; 
         free(front);         /* 释放一个结点空间*/
         front=rear;
     }
}

你可能感兴趣的:(队列)