这段代码的功能可以理解为模拟一个队列,它实现了三种操作:入队 (
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]
,也就是队列的头部元素,但不会修改begin
和size
,相当于查询队列头部元素。 - 如果队列为空,输出
"error\n"
,表示队列为空,无法获取头部元素。