一般数组队列(具有伪溢出的队列)

 该队列中需要用到的函数和结构体声明:

#pragma once
#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  
#include <assert.h>
// 定义队列中的元素类型  
typedef int Datatype;

// 定义队列结构体  
typedef struct Queue {
    Datatype* elements; // 指向队列元素的指针
    //数组下标
    int front;                 // 队列头部索引  
    int rear;                  // 队列尾部索引  
    //万金油参数
    int maxSize;             // 队列的容量  
    int curSize;             // 队列中元素的数量  
} Queue; 

// 初始化队列  
Queue* createQueue(int maxSize);

// 判断队列是否为空  
bool isEmpty(Queue* queue);

// 判断队列是否已满  
bool isFull(Queue* queue);

// 入队操作  
void enqueue(Queue* queue, Datatype element);

// 出队操作  
void dequeue(Queue* queue);

// 获取队列的前端元素  
Datatype peek(Queue* queue);

// 销毁队列  
void destroyQueue(Queue* queue);

函数实现:

Queue* createQueue(int maxSize)
{
    //创建队列内存
    Queue* newQueue = (Queue*)malloc(sizeof(Queue));
    assert(newQueue);
    //创建数据内存(注意该内存没有初始化)
    newQueue->elements = (Datatype*)malloc(maxSize * sizeof(Datatype));
    //初始化其余参数
    newQueue->front = 0;
    newQueue->rear = 0;
    newQueue->curSize = 0;
    newQueue->maxSize = maxSize;
    return newQueue;
}

bool isEmpty(Queue* queue)
{
    assert(queue);
    if (queue->curSize == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool isFull(Queue* queue)
{
    assert(queue);
    if (queue->curSize == queue->maxSize)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//数据尾插
void enqueue(Queue* queue, Datatype element)
{
    if (isFull(queue))
    {
        printf("队满\n");
        return;
    }
    //如果没满,则向后放,然后++运算
    queue->elements[queue->rear] = element;
    queue->rear++;
    queue->curSize++;
}

//数据头删
void dequeue(Queue* queue)
{
    assert(queue);
    if (isEmpty(queue))
    {
        printf("队空\n");
        return;
    }
    //只需要对front进行++运算即可
    queue->front++;
    queue->curSize--;
}

Datatype peek(Queue* queue)
{
    assert(queue);
    return queue->elements[queue->front];
}

void destroyQueue(Queue* queue)
{
    free(queue->elements);
    free(queue);
}

说明:该队列不是循环队列,有数组溢出的风险。下面是循环队列的介绍:

循环队列:在循环队列中,当rear到达数组末尾时,它应该回到数组的起始位置。同样,front也应该在到达数组末尾时循环回起始位置。为了实现循环队列,需要在enqueuedequeue函数中处理rearfront的循环逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值