隊列的那些事兒

前言

前面描述了堆棧是先進後入的方式,隊列則是我們傳統的先進先出方式,例如排隊買票,如果先去的人肯定是先買到票,後去的人則是後買到票。我們實現的時候仍然採用數組和鏈表的形式分別實現

數組實現

#include<stdio.h>
#include<stdlib.h>
#define MAX 5
// 定義隊列結構體
typedef struct queue {
    int data[MAX];
    int front;
    int rear;
}Queue;
// 初始化
void init(Queue *p) {
    p -> front = p -> rear = 0;
}
// 是否滿
int isFull(Queue *p) {
    return p -> rear > MAX - 1;
}
// 入隊列
void enQueue(Queue *p, int data) {
    if(isFull(p))
        printf("%d不能夠入隊列,隊列已滿\n", data);
    else
        p -> data[p -> rear++] = data;
}
// 是否爲空
int isEmpty(Queue *p) {
    return p -> front == MAX;
}
// 出隊列
int deQueue(Queue *p) {
    return p -> data[p -> front++];
}
int main() {
    Queue s;
    init(&s);
    for(int i=0; i<6; i++)
        enQueue(&s, i);
    while(!isEmpty(&s))
        printf("%d ", deQueue(&s));
    printf("\n");
    return 0;
}

鏈表實現

#include<stdio.h>
#include<stdlib.h>
// 定義每個節點
typedef struct node {
    int data;
    struct node *next;
} Node;
// 定義隊列節點
typedef struct queue {
    Node *front;
    Node *rear;
} Queue;
// 初始化
void init(Queue *p) {
    p -> front = p -> rear = (Node *) malloc(sizeof(Node));
}
//入隊列
void enQueue(Queue *p, int data) {
    Node *newNode;
    newNode = (Node *) malloc(sizeof(Node));
    newNode -> data = data;
    p -> rear -> data = data;
    p -> rear -> next = newNode;
    p -> rear = newNode;
}
//出隊列
int deQueue(Queue *p) {
    Node *r;
    int data;
    r = p -> front;
    data = r -> data;
    p -> front = r -> next;
    free(r);
    return data;
}
// 判斷是否爲空
int isEmpty(Queue *p) {
    return p -> front == p -> rear;
}
int main() {
    Queue s;
    init(&s);
    for(int i=0; i<6; i++)
        enQueue(&s, i);
    while(!isEmpty(&s))
        printf("%d ", deQueue(&s));
    printf("\n");
    return 0;
}
發佈了151 篇原創文章 · 獲贊 56 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章