キュー定義
キューとは、FIFO (First In First Out)、つまり先入れ先出しを特徴とするデータ構造のことです。
キューのデータは最後にのみ削除できるため、キューはチェックアウトするために並んでいる人々のグループであるキューとみなすことができ、最初に列に並んだ人が最初にチェックアウトします。
キューの実装
キューへのデータの挿入と削除は末尾挿入と先頭削除のみであり、順序表先頭削除の効率の低さを考慮してリンクリストを選択してキューを実現する。連結リストの末尾挿入効率は低いですが、末尾ポインタを使用することで末尾挿入効率を向上させることができます。
キューの実装:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int QueueDataType;
typedef struct QueueNode {
QueueDataType data;
struct QueueNode* next;
}QueueNode;
//头指针和尾指针可以写成变量,但是函数传参时会很麻烦,可以写成一个结构体:
typedef struct Queue {
QueueNode* first;
QueueNode* tail;
}Queue;
void QueueInit(Queue* p){
assert(p);
p->first = p->tail = NULL;
}
bool QueueEmpty(Queue* p){
assert(p);
return p->first == NULL;
}
void QueueDestory(Queue* p){
assert(p);
QueueNode* cur = p->first;
QueueNode* next = NULL;
while(cur){
next = cur->next
free(cur);
cur = next;
}
}
void QueuePush(Queue* p, QueueDataType x){
assert(p);
QueueNode* new = (QueueNode*)malloc(sizeof(QueueNode));
if(tem == NULL){
perror("malloc fail");
return;
}
nem->data = x;
nem->next = NULL;
//尾插分两种情况:队列为空或不为空
if(QueueEmpty){
p->first = p->tail = new;
}
else{
p->tail->next = new;
p->tail = new;
}
}
void QueuePop(Queue* p){
assert(p);
//数据删除,队列不能为空
assert(!QueueEmpty(p));
//头删分两种情况:
if(p->first == p->tail){
//队列中只有一个元素
free(p->first);
p->first = p->tail = NULL;
}
else{
//队列中有多个元素
QueueNode* next = p->first->next;
free(p->first);
p->first = next;
}
}
void QueueFront(Queue* p){
assert(p);
assert(!QueueEmpty(p));
return p->first->data;
}
void QueueTail(Queue* p){
assert(p);
assert(!QueueEmpty(p));
return p->tail->data;
}