明日复明日,明日何其多,我生待明日,万事成蹉跎
一. 一些基本概念
(1)队列:首先提到队列最先想到的就是它是一种先进先出FIFO(后进后出LILO)的线性表,和上节所介绍的栈的概念有很大不同。队列规定只能在其中一端插入数据,而从另外一端取出数据。插入数据的那端称作队尾(rear),取出数据的一端称为队头(front)。下面定义一个队列的链式存储框架:
//定义链表队列节点
typedef struct LINKNODE{
void* data;
struct LINKNODE* next;
}LinkNode;
//定义链表队列
typedef struct LINKQUEUE{
LinkNode front; //队头指针
LinkNode rear; //队尾指针
int queuesize;
}LinkQueue;
接着定义一个队列的顺序存储框架:
//定义顺序队列
typedef struct SEQQUEUE{
void* data[Max];
int queuesize;
}SeqQueue;
二. 代码实现
1. 队列的初始化
//初始化队列
SeqQueue* Init_SeqQueue(){
SeqQueue* queue = (SeqQueue*)malloc(sizeof(SeqQueue));
for(int i = 0; i < Max; i++){
queue -> data[i] = NULL;
}
queue -> queuesize = 0;
return queue;
}
2. 入队
//入队
void Push_SeqQueue(SeqQueue* queue, void* data){
//如果数据为空返回
if (data == NULL){
return;
}
//如果队列满则追加空间
if (queue -> queuesize == Max){
SeqQueue* queue = (SeqQueue*)realloc(SeqQueue* queue, (queue -> queuesize + INCREMENTSIZE) * sizeof(void*));
for(int i = 0; i < Max + INCREMENTSIZE; i++){
queue -> data[i] = NULL;
}
queue -> queuesize = queue -> (queuesize + INCREMENTSIZE);
}
queue -> data[queue -> queuesize] = data;
queue -> queuesize++;
}
3. 出队
//出队
void Pop_SeqQueue(SeqQueue* queue){
if (queue == NULL){
return NULL;
}
if (queue -> queuesize == 0){
return;
}
for(int i = 0; i < queue -> queuesize - 1; i++){
queue -> data[i] = queue -> data[i + 1];
}
queue -> queuesize--;
}
4. 常用函数
#include <queue> //引入的头文件
queue<int> qu;
qu.empty() 队列为空则返回真
qu.pop() 移除队列(头)第一个元素
qu.front() 返回队列(头)第一个元素
qu.push() 在队列(尾)增加元素
qu.size() 返回队列中元素数目
qu.back() 返回最后一个元素