用c语言实现。小明今天课上刚学习了队列数据结构,你看这个队列他又长又宽,就像这个碗他又大又圆。 不过小明觉得队列只能从队尾插入,队首弹出太无聊了,于是他就想重新设计以下,以使队列能够翻转。 翻转:队首变为队尾,队尾变为队首。 那么现在队列变成了有以下三个操作的队列: 队尾插入 队首弹出 翻转队列 初始时,这里有一个空队列,我们对他进行以上三个操作。 输入格式: 第一行一个正整数q(1<=q<=400000),表示对队列的操作次数,初始时,队列为空。 接下来q行, 若是 1 x,则将x插入当前队列(1<=x<=1000000)。 若是 2,则从队列中弹出队首元素(若当前队列为空,则忽略此操作) 若是 3,则翻转当前队列 输出格式: 对于每个输入输出一行一个整数,为当前队列队首和队尾的异或值(这里的异或是按位异或,运算符为 '^')。 若当前队列为空,则输出-1
时间: 2023-10-05 12:09:50 浏览: 95
以下是用 C 语言实现的代码,使用了双端队列的数据结构来实现队列的翻转操作:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 400005
int q[MAX_N]; // 双端队列
int head = 0, tail = 0; // 队列头尾指针
// 在队尾插入元素 x
void push_back(int x) {
q[tail++] = x;
}
// 在队首弹出元素
void pop_front() {
if (head < tail) head++;
}
// 翻转队列
void reverse() {
int i = head, j = tail - 1;
while (i < j) {
int tmp = q[i];
q[i] = q[j];
q[j] = tmp;
i++;
j--;
}
head = head + tail - 1;
tail = head + 1;
}
int main() {
int qn;
scanf("%d", &qn);
for (int i = 0; i < qn; i++) {
int op;
scanf("%d", &op);
switch (op) {
case 1: {
int x;
scanf("%d", &x);
push_back(x);
break;
}
case 2: {
if (head < tail) pop_front();
break;
}
case 3: {
reverse();
break;
}
}
if (head >= tail) {
printf("-1\n");
} else {
printf("%d\n", q[head] ^ q[tail - 1]);
}
}
return 0;
}
```
代码中,我们使用了一个双端队列 `q` 来存储队列中的元素。队首和队尾分别用 `head` 和 `tail` 表示。在队列的翻转操作中,我们只需要将队列中的元素倒序排列,并更新队首和队尾的指针即可。在每次操作后,我们输出当前队列队首和队尾的异或值,如果队列为空,则输出 `-1`。
阅读全文