8584 循环队列的基本操作

思路

  1. **初始化队列**:分配初始大小为 `MAXQSIZE` 的内存空间,并将 `front` 和 `rear` 指针初始化为 0。

  2. **入队**:检查队列是否已满,如果未满则将新元素插入队尾,并更新 `rear` 指针。

  3. **出队**:检查队列是否为空,如果不为空则删除队头元素,并更新 `front` 指针。

  4. **获取队头元素**:检查队列是否为空,如果不为空则返回队头元素。

  5. **获取队列的长度**:计算并返回队列的元素个数。

  6. **遍历队列**:从队头到队尾依次输出队列中的每个元素。

伪代码

```

function InitQueue(Q):

Q.base = allocate memory of size MAXQSIZE

Q.front = 0

Q.rear = 0

return OK

function EnQueue(Q, e):

if (Q.rear + 1) % MAXQSIZE == Q.front:

return ERROR

Q.base[Q.rear] = e

Q.rear = (Q.rear + 1) % MAXQSIZE

return OK

function DeQueue(Q, e):

if Q.front == Q.rear:

return ERROR

e = Q.base[Q.front]

Q.front = (Q.front + 1) % MAXQSIZE

return OK

function GetHead(Q, e):

if Q.front == Q.rear:

return ERROR

e = Q.base[Q.front]

return OK

function QueueLength(Q):

return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE

function QueueTraverse(Q):

if Q.front == Q.rear:

print "The Queue is Empty!"

else:

print "The Queue is: "

i = Q.front

while i != Q.rear:

print Q.base[i]

i = (i + 1) % MAXQSIZE

return OK

```

C++代码

cpp 复制代码
#include <malloc.h>
#include <stdio.h>
#define OK 1
#define ERROR 0
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int QElemType;
#define MAXQSIZE 100 // 最大队列长度(对于循环队列,最大队列长度要减1)

typedef struct {
    QElemType *base; // 初始化的动态分配存储空间
    int front; // 头指针,若队列不空,指向队列头元素
    int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
} SqQueue;

Status InitQueue(SqQueue &Q) {
    Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
    if (!Q.base) return ERROR;
    Q.front = 0;
    Q.rear = 0;
    return OK;
}

Status EnQueue(SqQueue &Q, QElemType e) {
    if ((Q.rear + 1) % MAXQSIZE == Q.front) return ERROR; // 队列满
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXQSIZE;
    return OK;
}

Status DeQueue(SqQueue &Q, QElemType &e) {
    if (Q.front == Q.rear) return ERROR; // 队列空
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAXQSIZE;
    return OK;
}

Status GetHead(SqQueue Q, QElemType &e) {
    if (Q.front == Q.rear) return ERROR; // 队列空
    e = Q.base[Q.front];
    return OK;
}

int QueueLength(SqQueue Q) {
    return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

Status QueueTraverse(SqQueue Q) {
    int i = Q.front;
    if (Q.front == Q.rear) {
        printf("The Queue is Empty!\n");
    } else {
        printf("The Queue is: ");
        while (i != Q.rear) {
            printf("%d ", Q.base[i]);
            i = (i + 1) % MAXQSIZE;
        }
        printf("\n");
    }
    return OK;
}

int main() {
    int a;
    SqQueue S;
    QElemType x, e;
    if (InitQueue(S) == OK) {
        printf("A Queue Has Created.\n");
    }
    while (1) {
        printf("1:Enter \n2:Delete \n3:Get the Front \n4:Return the Length of the Queue\n5:Load the Queue\n0:Exit\nPlease choose:\n");
        scanf("%d", &a);
        switch (a) {
            case 1:
                scanf("%d", &x);
                if (EnQueue(S, x) == ERROR) printf("Enter Error!\n");
                else printf("The Element %d is Successfully Entered!\n", x);
                break;
            case 2:
                if (DeQueue(S, e) == ERROR) printf("Delete Error!\n");
                else printf("The Element %d is Successfully Deleted!\n", e);
                break;
            case 3:
                if (GetHead(S, e) == ERROR) printf("Get Head Error!\n");
                else printf("The Head of the Queue is %d!\n", e);
                break;
            case 4:
                printf("The Length of the Queue is %d!\n", QueueLength(S));
                break;
            case 5:
                QueueTraverse(S);
                break;
            case 0:
                return 1;
        }
    }
}
相关推荐
Paddi93035 分钟前
Codeforces Round 1004 (Div. 1) C. Bitwise Slides
c++·算法
Luis Li 的猫猫1 小时前
深度学习中的知识蒸馏
人工智能·经验分享·深度学习·学习·算法
查理零世2 小时前
【蓝桥杯集训·每日一题2025】 AcWing 6118. 蛋糕游戏 python
python·算法·蓝桥杯
敲代码的小王!2 小时前
MD5加密算法和BCrypt密码加密算法
java·算法·安全
带娃的IT创业者3 小时前
机器学习实战(6):支持向量机(SVM)——强大的非线性分类器
算法·机器学习·支持向量机
流星白龙5 小时前
【C++】36.C++IO流
开发语言·c++
Java能学吗5 小时前
2.17学习总结
数据结构·学习
孑么5 小时前
力扣 买卖股票的最佳时机
算法·leetcode·职场和发展·贪心算法·动态规划
诚信爱国敬业友善6 小时前
常见排序方法的总结归类
开发语言·python·算法
靡不有初1116 小时前
CCF-CSP第31次认证第二题——坐标变换(其二)【NA!前缀和思想的细节,输出为0的常见原因】
c++·学习·ccfcsp