队列。。。

test1

#include <stdio.h>

// 定义队列的最大容量
#define MAXSIZE 100
// 定义队列中元素的数据类型为整型
typedef int ElemType;

// 定义队列结构体
typedef struct 
{
    // 用于存储队列元素的数组,大小为 MAXSIZE
    ElemType data[MAXSIZE];
    // 队头指针,指示队列头部元素的位置
    int front;
    // 队尾指针,指示队列尾部元素的下一个位置
    int rear;
} Queue;

// 初始化队列
void initQueue(Queue *Q)
{
    // 将队头指针初始化为 0
    Q->front = 0;
    // 将队尾指针初始化为 0
    Q->rear = 0;
}

// 判断队列是否为空
int isEmpty(Queue *Q)
{
    // 当队头指针和队尾指针相等时,队列中没有元素,队列为空
    if (Q->front == Q->rear)
    {
        // 打印提示信息
        printf("空的\n");
        return 1;
    }
    else
    {
        return 0;	
    }
}

// 出队操作
ElemType dequeue(Queue *Q)
{
    // 检查队列是否为空
    if (Q->front == Q->rear)
    {
        // 若为空,打印提示信息并返回 0
        printf("空的\n");
        return 0;
    }
    // 取出队头元素
    ElemType e = Q->data[Q->front];
    // 队头指针向后移动一位
    Q->front++;
    return e;
}

// 队列满时调整队列
int queueFull(Queue *Q)
{
    // 当队头指针大于 0 时,说明队列前面有空闲空间
    if (Q->front > 0)
    {
        // 记录队头指针的值,即需要向前移动的步数
        int step = Q->front;
        // 将队列中的元素向前移动 step 个位置
        for (int i = Q->front; i < Q->rear; ++i)
        {
            Q->data[i - step] = Q->data[i];
        }
        // 队头指针重置为 0
        Q->front = 0;
        // 队尾指针相应地向前移动 step 个位置
        Q->rear = Q->rear - step;
        return 1;
    }
    else
    {
        // 队头指针为 0,说明队列真正满了,没有空闲空间可调整
        printf("真的满了\n");
        return 0;
    }
}

// 入队操作
int equeue(Queue *Q, ElemType e)
{
    // 检查队尾指针是否超出了队列的最大容量
    if (Q->rear >= MAXSIZE)
    {
        // 尝试调整队列
        if(!queueFull(Q))
        {
            // 调整失败,说明队列确实已满,入队失败
            return 0;
        }
    }
    // 将元素 e 放入队尾位置
    Q->data[Q->rear] = e;
    // 队尾指针向后移动一位
    Q->rear++;
    return 1;
}

// 获取队头元素
int getHead(Queue *Q, ElemType *e)
{
    // 检查队列是否为空
    if (Q->front == Q->rear)
    {
        // 若为空,打印提示信息并返回 0
        printf("空的\n");
        return 0;
    }
    // 将队头元素的值赋给指针 e 所指向的内存位置
    *e = Q->data[Q->front];
    return 1;
}

int main(int argc, char const *argv[])
{
    // 定义一个队列变量
    Queue q;
    // 初始化队列
    initQueue(&q);

    // 依次将元素 10、20、30、40、50 入队
    equeue(&q, 10);
    equeue(&q, 20);
    equeue(&q, 30);
    equeue(&q, 40);
    equeue(&q, 50);

    // 进行出队操作,并打印出队元素
    printf("%d\n",dequeue(&q));
    printf("%d\n",dequeue(&q));

    // 用于存储队头元素的变量
    ElemType e;
    // 获取队头元素
    getHead(&q, &e);
    // 打印队头元素
    printf("%d\n",e);

    return 0;
}

 test2

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

// 定义队列的最大容量
#define MAXSIZE 100
// 定义队列元素的数据类型为整型
typedef int ElemType;

// 定义队列的结构体
typedef struct 
{
    // 指向存储队列元素的数组的指针
    ElemType *data;
    // 队头指针,指示队列头部元素的位置
    int front;
    // 队尾指针,指示队列尾部元素的下一个位置
    int rear;
} Queue;

// 初始化队列
Queue* initQueue()
{
    // 为队列结构体分配内存
    Queue *q = (Queue*)malloc(sizeof(Queue));
    // 为存储队列元素的数组分配内存,大小为 MAXSIZE 个 ElemType 类型元素
    q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    // 初始化队头指针为 0
    q->front = 0;
    // 初始化队尾指针为 0
    q->rear = 0;
    return q;
}

// 判断队列是否为空
int isEmpty(Queue *Q)
{
    // 当队头指针和队尾指针相等时,说明队列为空
    if (Q->front == Q->rear)
    {
        printf("空的\n");
        return 1;
    }
    else
    {
        return 0;	
    }
}

// 出队操作
ElemType dequeue(Queue *Q)
{
    // 检查队列是否为空
    if (Q->front == Q->rear)
    {
        printf("空的\n");
        return 0;
    }
    // 取出队头元素
    ElemType e = Q->data[Q->front];
    // 队头指针向后移动一位
    Q->front++;
    return e;
}

// 队列满了,调整队列
int queueFull(Queue *Q)
{
    // 如果队头指针大于 0,说明队列前面有空闲空间
    if (Q->front > 0)
    {
        // 记录队头指针的值,作为移动的步数
        int step = Q->front;
        // 将队列中的元素向前移动 step 个位置
        for (int i = Q->front; i <= Q->rear; ++i)
        {
            Q->data[i - step] = Q->data[i];
        }
        // 队头指针重置为 0
        Q->front = 0;
        // 队尾指针相应地向前移动 step 个位置
        Q->rear = Q->rear - step;
        return 1;
    }
    else
    {
        // 队头指针为 0,说明队列真正满了
        printf("真的满了\n");
        return 0;
    }
}

// 入队操作
int equeue(Queue *Q, ElemType e)
{
    // 检查队尾指针是否超出了队列的最大容量
    if (Q->rear >= MAXSIZE)
    {
        // 尝试调整队列
        if(!queueFull(Q))
        {
            // 调整失败,入队操作失败
            return 0;
        }
    }
    // 将元素 e 放入队尾位置
    Q->data[Q->rear] = e;
    // 队尾指针向后移动一位
    Q->rear++;
    return 1;
}

// 获取队头元素
int getHead(Queue *Q, ElemType *e)
{
    // 检查队列是否为空
    if (Q->front == Q->rear)
    {
        printf("空的\n");
        return 0;
    }
    // 将队头元素的值赋给指针 e 所指向的内存位置
    *e = Q->data[Q->front];
    return 1;
}

int main(int argc, char const *argv[])
{
    // 初始化一个队列
    Queue *q = initQueue();

    // 依次将元素 10、20、30、40、50 入队
    equeue(q, 10);
    equeue(q, 20);
    equeue(q, 30);
    equeue(q, 40);
    equeue(q, 50);

    // 进行出队操作,并打印出队元素
    printf("%d\n",dequeue(q));
    printf("%d\n",dequeue(q));

    // 用于存储队头元素的变量
    ElemType e;
    // 获取队头元素
    getHead(q, &e);
    // 打印队头元素
    printf("%d\n",e);

    return 0;
}

test3 

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

// 定义队列的最大容量
#define MAXSIZE 100
// 定义队列中元素的类型为整数
typedef int ElemType;

// 定义队列的结构体
typedef struct 
{
    // 用于存储队列元素的数组指针
    ElemType *data;
    // 队列头指针,指向队列头部元素的位置
    int front;
    // 队列尾指针,指向队列尾部元素的下一个位置
    int rear;
} Queue;

// 初始化队列
Queue* initQueue()
{
    // 为队列结构体分配内存
    Queue *q = (Queue*)malloc(sizeof(Queue));
    // 为队列的数据数组分配内存,大小为 MAXSIZE 个 ElemType 元素
    q->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    // 初始化队列头指针为 0
    q->front = 0;
    // 初始化队列尾指针为 0
    q->rear = 0;
    return q;
}

// 判断队列是否为空
int isEmpty(Queue *Q)
{
    // 当队列头指针和尾指针相等时,队列为空
    if (Q->front == Q->rear)
    {
        printf("空的\n");
        return 1;
    }
    else
    {
        return 0;
    }
}

// 入队操作,将元素 e 加入队列尾部
int equeue(Queue *Q, ElemType e)
{
    // 判断队列是否已满,使用取模运算处理循环队列
    if ((Q->rear + 1) % MAXSIZE == Q->front)
    {
        printf("满了\n");
        return 0;
    }
    // 将元素 e 放入队列尾部
    Q->data[Q->rear] = e;
    // 更新队列尾指针,使用取模运算实现循环
    Q->rear = (Q->rear + 1) % MAXSIZE;
    return 1;
}

// 出队操作,将队列头部元素取出并存储到 e 中
int dequeue(Queue *Q, ElemType *e)
{
    // 检查队列是否为空
    if (Q->front == Q->rear)
    {
        printf("空的\n");
        return 0;
    }
    // 将队列头部元素存储到 e 中
    *e = Q->data[Q->front];
    // 更新队列头指针,使用取模运算实现循环
    Q->front = (Q->front + 1) % MAXSIZE;
    return 1;
}

// 获取队列头部元素
int getHead(Queue *Q, ElemType *e)
{
    // 检查队列是否为空
    if (Q->front == Q->rear)
    {
        printf("空的\n");
        return 0;
    }
    // 将队列头部元素存储到 e 中
    *e = Q->data[Q->front];
    return 1;
}

int main(int argc, char const *argv[])
{
    // 初始化一个队列
    Queue *q = initQueue();

    // 依次将元素 10、20、30、40、50 入队
    equeue(q, 10);
    equeue(q, 20);
    equeue(q, 30);
    equeue(q, 40);
    equeue(q, 50);

    // 用于存储出队元素的变量
    ElemType e;
    // 进行一次出队操作
    dequeue(q, &e);
    // 打印出队的元素
    printf("%d\n", e);
    // 再进行一次出队操作
    dequeue(q, &e);
    // 打印出队的元素
    printf("%d\n", e);

    // 获取队列头部元素
    getHead(q, &e);
    // 打印队列头部元素
    printf("%d\n", e);

    return 0;
}

test4

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

// 定义队列中元素的类型为整数
typedef int ElemType;

// 定义队列节点的结构体
typedef struct QueueNode
{
    // 存储节点的数据
    ElemType data;
    // 指向下一个节点的指针
    struct QueueNode *next;
} QueueNode;

// 定义队列的结构体
typedef struct 
{
    // 指向队列头节点的指针
    QueueNode *front;
    // 指向队列尾节点的指针
    QueueNode *rear;
} Queue;

// 初始化队列
Queue* initQueue()
{
    // 为队列结构体分配内存
    Queue *q = (Queue*)malloc(sizeof(Queue));
    // 为队列的头节点分配内存
    QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));
    // 头节点的数据初始化为 0
    node->data = 0;
    // 头节点的下一个节点初始化为 NULL
    node->next = NULL;
    // 队列的头指针指向头节点
    q->front = node;
    // 队列的尾指针也指向头节点,此时队列为空
    q->rear = node;
    return q;
}

// 判断队列是否为空
int isEmpty(Queue *q)
{
    // 如果队列的头指针和尾指针相等,说明队列为空
    if (q->front == q->rear)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

// 入队操作,将元素 e 加入队列尾部
void equeue(Queue *q, ElemType e)
{
    // 为新节点分配内存
    QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode));
    // 新节点的数据设置为 e
    node->data = e;
    // 新节点的下一个节点初始化为 NULL
    node->next = NULL;
    // 将新节点连接到队列尾部
    q->rear->next = node;
    // 更新队列的尾指针指向新节点
    q->rear = node;
}

// 出队操作,将队列头部元素取出并存储到 e 中
int dequeue(Queue *q, ElemType *e)
{
    // 检查队列是否为空
    if (isEmpty(q))
    {
        printf("空的\n");
        return 0;
    }

    // 找到队列头部的第一个有效节点
    QueueNode *node = q->front->next;
    // 将该节点的数据存储到 e 中
    *e = node->data;
    // 更新队列的头指针,跳过该节点
    q->front->next = node->next;
    // 如果出队的节点是队列的最后一个节点
    if (q->rear == node)
    {
        // 将队列的尾指针指向头节点,使队列再次为空
        q->rear = q->front;
    }
    // 释放出队节点的内存
    free(node);
    return 1;
}

// 获取队列头部元素
ElemType getFront(Queue *q)
{
    // 检查队列是否为空
    if (isEmpty(q))
    {
        printf("空的\n");
        return 0;
    }
    // 返回队列头部的第一个有效节点的数据
    return q->front->next->data;
}

int main(int argc, char const *argv[])
{
    // 初始化一个队列
    Queue *q = initQueue();
    // 依次将元素 10、20、30、40、50 入队
    equeue(q, 10);
    equeue(q, 20);
    equeue(q, 30);
    equeue(q, 40);
    equeue(q, 50);
    // 用于存储出队元素的变量
    ElemType e;
    // 进行一次出队操作
    dequeue(q, &e);
    // 打印出队的元素
    printf("出队%d\n", e);
    // 再进行一次出队操作
    dequeue(q, &e);
    // 打印出队的元素
    printf("出队%d\n", e);
    // 打印队列头部的元素
    printf("%d\n", getFront(q));
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值