数据结构——队列练习题

在C语言中,.和->运算符用于访问结构体的成员变量。它们之间的区别在于:.运算符用于访问结构体变量的成员。->运算符用于访问结构体指针变量的成员

1a(rear指向队尾元素后一位,判空判满时牺牲一个存储单元)

首先我们考虑1a的情况下在牺牲一个存储单元rear指向队尾元素后一个位置该怎么实现队列的基本操作,当rear指向队尾元素的后一位时,队列的实现需要牺牲一个存储单元来区分队列是空还是满

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数

typedef struct {
    int data[MaxSize]; // 用静态数组存放队列元素
    int front, rear; // 队头指针和队尾指针
} SqQueue;

// 初始化队列
void InitQueue(SqQueue* Q) {
    Q->front = Q->rear = 0; // 初始时队头、队尾指针指向0
}

// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {
    return Q->front == Q->rear; // 判空条件:队头指针等于队尾指针
}

// 判断队列是否已满
bool QueueFull(SqQueue* Q) {
    return (Q->rear + 1) % MaxSize == Q->front; // 判满条件:队尾指针后移一位后等于队头指针
}

// 入队
bool EnQueue(SqQueue* Q, int x) {
    if (QueueFull(Q)) { // 判断队满
        return false; // 队满报错
    } else {
        Q->data[Q->rear] = x; // 新元素插入队尾
        Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移
        return true;
    }
}

// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    } else {
        Q->front = (Q->front + 1) % MaxSize; // 队头指针后移
        *x = Q->data[Q->front]; // 获取队头元素
        return true;
    }
}

// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {
    if (QueueEmpty(Q)) { // 判断队空
        return false; // 队空则报错
    } else {
        *x = Q->data[Q->front]; // 获取队头元素
        return true;
    }
}

在这个实现中,队列满的条件是队尾指针后移一位后等于队头指针。这意味着队列的实际容量是MaxSize - 1,因为一个存储单元被用来区分队列是空还是满。 

2a(rear指向队尾元素,判空判满时牺牲一个存储单元)

当rear指向队尾元素时,队列的实现不需要牺牲额外的存储单元来区分队列是空还是满。在这种情况下,队列的实际容量就是MaxSize,因为所有的存储单元都可以用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值