数据结构:队列之顺序队列

队列:简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,在表的另一端进行删除。

向队列中插入元素称为入队或进队,删除元素称为出队或离队。

先进先出的线性表。

队头:允许删除的一端。

队尾:允许插入的一端。

空队列:不含任何元素的空表。

 

数据结构:队列之顺序队列_第1张图片

 

队列的常见操作:

初始化队列

判队为空

入队:若队列未满,将x加入,使之成为新的队尾

出队:若队列非空,删除队头元素,并用x返回

读队头元素

注意:队列是操作受限的线性表,所以,不是任何对线性表的操作都可以作为队列的操作。比如,不可以随便读取队列中间的某个数据。

王道上的图

队列的顺序存储

队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front和rear分别指示队头元素和队尾元素的位置。

设队头指针指向队头元素,队尾指针指向队尾元素的下一个位置。

(也可以让rear指向队尾元素,front指向队头元素 的前一个位置)

 

队列的顺序存储类型描述:

#define  MAXSIZE    4
typedef  int dataType;

 

typedef struct{
    dataType data[MAXSIZE];
    int front;
    int rear;
}SqQueue;

#define  MAXSIZE    4
typedef  int dataType;

 

typedef struct{
    dataType *data;
    int front;
    int rear;
}SqQueue;

参考:https://wenku.baidu.com/view/5a0cadcf6c85ec3a87c2c5fa.html

boolean initQueue(SqQueue **q){
    if(*q != NULL){
        return FALSE;
    }
    
    *q = (SqQueue *)malloc(sizeof(SqQueue));
    (*q)->front = 0;
    (*q)->rear = 0;
    
    return TRUE;
}

 

void main(void){
    SqQueue  *q = NULL;

    ....

}

boolean initQueue(SqQueue **q){
    if(*q != NULL){
        return FALSE;
    }
    
    *q = (SqQueue *)malloc(sizeof(SqQueue));

    (*q)->data = (dataType *)malloc(sizeof(dataType) * MAXSIZE); 
    (*q)->front = 0;
    (*q)->rear = 0;
    
    return TRUE;
}

 

void main(void){
    SqQueue  *q = NULL;

    ....

}

 

 

初始状态(队空条件):Q.front == Q.rear ==  0

进队操作:队不满时,先送值到队尾元素,再将队尾指针加1

出队操作:队不空时,先取队头元素值,再将队头指针加1

 

 

可以用 Q.front = Q.rear = 0 作为队列判空的条件

但是不可以用 Q.rear = MAXSIZE 作为队列满的条件

上图(d)中,队列中仅有一个元素,但仍满足该条件。这时入队出现“上溢出”,但这种溢出并不是真正的溢出,在data数组中依然存在可以存放元素的空位置,所以是一种“假溢出”。

 

可以用循环队列来克服这种缺点。

 

 

 

 

 

你可能感兴趣的:(数据结构与算法,数据结构,队列,顺序队列)