实现一个队列

这段代码的功能可以理解为模拟一个队列,它实现了三种操作:入队 (push)、出队 (pop)、获取队列前端元素 (front)。

代码:

#include <cstdio>  // 包含C语言的标准输入输出库
using namespace std;

int main() {
    int n;                       // 输入操作的次数
    int max = 100000;            // 最大队列容量,定义为100000
    char* str = new char[5];     // 用于存储操作的字符串,比如 "push", "pop", "front"
    int* arr = new int[max];     // 用于模拟队列的数组,大小为 max
    int size = 0;                // 当前队列的大小,初始化为0
    int begin = 0;               // 队列头部,表示当前队列的第一个元素
    int end = 0;                 // 队列尾部,表示下一个要插入的位置

    // 读取操作次数 n
    scanf("%d", &n);

    // 循环处理 n 次操作
    while (n--) {
        // 读取操作字符串,例如 "push", "pop", "front"
        scanf("%s", str);

        // 判断操作类型
        if (str[1] == 'u') {  // 操作为 "push"
            int num;
            scanf("%d", &num);     // 读取要入队的整数 num
            arr[end] |= num;       // 将 num 插入到队列的尾部
            end++;                 // 队列尾部后移
            size++;                // 队列大小加1
        }
        else if (str[1] == 'o') {  // 操作为 "pop"
            if (size > 0) {
                printf("%d\n", arr[begin]);  // 输出队列头部元素
                begin++;                    // 队列头部后移
                size--;                     // 队列大小减1
            }
            else {
                printf("error\n");  // 如果队列为空,输出 "error"
            }
        }
        else if (str[1] == 'r') {  // 操作为 "front"
            if (size > 0) {
                printf("%d\n", arr[begin]);  // 输出队列头部元素,不修改 begin 和 size
            }
            else {
                printf("error\n");  // 如果队列为空,输出 "error"
            }
        }
    }

    // 释放动态分配的内存
    delete[] str;
    delete[] arr;

    return 0;  // 程序结束
}

代码讲解

1. 变量的初始化

int n;                // 表示输入的操作次数
int max=100000;       // 表示数组 arr 的最大容量
char* str=new char[5]; // 存储操作的字符串,例如 "push", "pop", "front"
int* arr=new int[max]; // 用于模拟队列的数组,大小为 100000
int size=0;           // 队列的当前大小
int begin=0;          // 队列的起始位置(队列的头部)
int end=0;            // 队列的结束位置(队列的尾部)
  • n:用户输入的操作次数。
  • max:用来限制数组的大小,最大可以存储 100,000 个整数。
  • str:用于存储操作类型的字符串,例如 "push", "pop", "front"。
  • arr:一个整数数组,用来模拟队列,具体的操作(入队、出队)将在这个数组上进行。
  • size:当前队列中有多少元素,用于记录队列的大小。
  • begin:队列头部,指向当前队列的第一个元素。
  • end:队列尾部,指向队列的下一个插入位置。

2. 输入处理

scanf("%d",&n);

读取用户输入的操作次数 n,表示接下来会有 n 次操作。

3. 循环操作

while(n--){
    scanf("%s",str);
  • 每次操作前,读取用户输入的操作类型,存储在 str 中。用户输入的操作可能是 push, pop, 或者 front,这些操作通过字符串的形式输入。

4. 判断操作类型

通过 str[1] 来区分不同的操作:

  • str[1] == 'u':表示 push 操作(例如 "push" 字符串的第二个字符为 'u')。
  • str[1] == 'o':表示 pop 操作(例如 "pop" 的第二个字符为 'o')。
  • str[1] == 'r':表示 front 操作(例如 "front" 的第二个字符为 'r')。

5. push 操作

if(str[1]=='u'){
    int num;
    scanf("%d",&num);  // 读取需要入队的整数 num
    arr[end]|=num;     // 将 num 插入到队列尾部
    end++;             // 队列尾部后移
    size++;            // 队列大小增加
}
  • 当操作为 push 时,程序会读取一个整数 num,并将它存入数组 arr[end] 的位置。
  • end++:表示队列的尾部向后移动,准备接受下一个入队的元素。
  • size++:表示队列大小增加了 1。

6. pop 操作

else if(str[1]=='o'){
    if(size>0){printf("%d\n",arr[begin]);begin++;size--;}  // 队列有元素,打印队头,队头后移
    else printf("error\n");  // 队列为空,报错
}
  • 当操作为 pop 时,程序检查 size 是否大于 0,也就是判断队列是否为空。
    • 如果队列不为空,打印当前 arr[begin],也就是队列的头部元素,并将 begin++,表示队列头部向后移动。
    • size--:队列大小减少 1。
    • 如果队列为空,直接输出 "error\n",表示无法进行 pop 操作。

7. front 操作

else if(str[1]=='r'){
    if(size>0)printf("%d\n",arr[begin]);  // 队列有元素,打印队头
    else printf("error\n");  // 队列为空,报错
}

当操作为 front 时,程序检查 size 是否大于 0。

  • 如果队列不为空,直接输出 arr[begin],也就是队列的头部元素,但不会修改 beginsize,相当于查询队列头部元素。
  • 如果队列为空,输出 "error\n",表示队列为空,无法获取头部元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值