队列的实现(顺序表和链表)

目录

  • 一、队列的概念
  • 二、入队
  • 三、出队
  • 四、出队

一、队列的概念

队列是仅限于在表尾进行插入,表头进行删除元素的线性表,遵循先进先出,就像排队一样。

队列常用于实现排队系统,任务调度,消息传递,我们一般可以用 顺序表 或者 链表来实现队列

二、入队

1.入队的概念

队列的插入叫做入队,它是将数据元素进行插入的过程

2.入队的步骤

第一步,将元素添加到队列的尾部,更新队尾指针或者索引

第二部,队列大小加一

三、出队

1.出队的概念

队列的删除叫做出队,他将队首元素进行删除的过程。

2.出队的步骤

第一步,删除队首元素,更新队首指针或者索引。

第二部,队列的大小减一

四、获取队首元素

1.获取队首元素的概念

返回队首指针指向元素的值,无论是链表还是顺序表,都可以通过队首指针或者索引在o(1)的时间复杂度获取到队首元素。

2.获取队首元素的步骤

第一步,利用队首指针或者索引获取队首元素返回。查询不会影响队列大小。

五、代码实现

1.顺序表实现

#include <stdio.h>
#include <stdlib.h>

#define eleType int

// 定义一个结构体队列
typedef struct {
    eleType* elements; // 队列列表
    size_t front;      // 首元素索引
    size_t rear;       // 尾元素索引
    size_t capacity;   // 队列容量
}Queue;

// 队列初始化
void Queuecreat(Queue* q){
    q->elements = (eleType*)malloc(sizeof(eleType) * 8);    // 分配八个eleType大小元素空间
    q->front = 0;                                           // 首元素索引为0
    q->rear = 0;                                            // 尾元素索引为0
    q->capacity = 8;                                        // 容量初始化为8
}

// 队列的销毁
void Queuedestroy(Queue* q){
    free(q->elements);                                      // 释放空间
    q->front = 0;                                           
    q->rear = 0;
    q->capacity = 0;
    q->elements = NULL;
}

// 队列的扩容
void Queueresize(Queue* q){
    eleType* newq = (eleType*)realloc(q->elements,sizeof(eleType)*(q->capacity * 2)); // 重新分配空间为原来的2倍
    q->elements = newq;                                                               // 原来的更新为新的   
    q->capacity = q->capacity * 2;                                                    // 容量乘以2
}

// 入队
void Queuepush(Queue* q,eleType element){
    if(q->rear == q->capacity){                     // 如果队尾索引等于容量说明队列满了,进行扩容操作
        Queueresize(q);                                                     
    }
    q->elements[q->rear++] = element;               // 
}

// 出队
eleType Queuepop(Queue* q){
    if(q->front == q->rear){
        printf("空栈\n");
        exit(1);
    }
    return q->elements[q->front++];
}

// 获取队首元素
eleType Queuetop(Queue* q){
    if(q->front == q->rear){
        printf("空栈\n");
        exit(1);
    }
    return q->elements[q->front];
}

// 获取队列大小
size_t Queuesize(Queue* q){
    return q->rear - q->front;
}


int main(){
    Queue q;
    Queuecreat(&q);
    Queuepush(&q,100);
    Queuepush(&q,200);
    Queuepush(&q,30);
    Queuepush(&q,60);
    Queuepush(&q,50);
    Queuepush(&q,70);
    Queuepush(&q,80);
    Queuepush(&q,90);
    Queuepush(&q,100);
    printf("pop is %d\n",Queuepop(&q));
    printf("top is %d\n",Queuetop(&q));
    printf("size is %d\n",Queuesize(&q));
    Queuedestroy(&q);
    return 0;
}

在这里插入图片描述

加入九个元素,弹出一个没什么问题,

2.链表实现

#include <stdio.h>
#include <stdlib.h>

#define eleType int

typedef struct Node {
    eleType data;
    struct Node* next;
} Node;

typedef struct {
    Node* front;
    Node* rear;
    size_t size;
} Queue;

// 创建队列
void Queuecreat(Queue* q) {
    q->front = q->rear = NULL;
    q->size = 0;
}

// 销毁队列
void Queuedestroy(Queue* q) {
    while (q->front) {
        Node* current = q->front;
        q->front = q->front->next;
        free(current);
    }
    q->rear = NULL;
    q->size = 0;
}

// 入队
void Queuepush(Queue* q, eleType element) {
    Node* newnode = (Node*)malloc(sizeof(Node));
    newnode->data = element;
    newnode->next = NULL;
    if (q->rear == NULL) {
        q->front = q->rear = newnode;
    } else {
        q->rear->next = newnode;
        q->rear = newnode;
    }
    q->size++;
}

// 出队
eleType Queuepop(Queue* q) {
    if (q->front == NULL) {
        printf("空队列\n");
        exit(1);
    }
    eleType element = q->front->data;
    Node* temp = q->front;
    q->front = q->front->next;
    free(temp);
    q->size--;
    if (q->size == 0) {
        q->rear = NULL;
    }
    return element;
}

// 获取队首元素
eleType Queuetop(Queue* q) {
    if (q->front == NULL) {
        printf("空队列\n");
        exit(1);
    }
    return q->front->data;
}

// 获取队列大小
size_t Queuesize(Queue* q) {
    return q->size;
}

int main() {
    Queue q;
    Queuecreat(&q);
    Queuepush(&q, 10);
    Queuepush(&q, 20);
    Queuepush(&q, 30);
    printf("队首元素是 %d\n", Queuetop(&q));
    printf("出队元素是 %d\n", Queuepop(&q));
    printf("队首元素是 %d\n", Queuetop(&q));
    printf("队列大小是 %zu\n", Queuesize(&q));
    Queuedestroy(&q);
    return 0;
}

在这里插入图片描述

没有问题

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值