第一行输入一个整数N,表示对队列进行的操作总数。
下面N行每行输入一个字符串S,表示操作的种类。
如果S为"add",则后面还有一个整数X表示向队列尾部加入整数X。
如果S为"poll",则表示弹出队列头部操作。
如果S为"peek",则表示询问当前队列中头部元素是多少。
对于每一个为"peek"的操作,输出一行表示当前队列中头部元素是多少。
6 add 1 add 2 add 3 peek poll peek
1 2
1<=N<=1000000
-1000000<=X<=1000000
数据保证没有不合法的操作
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdbool.h>
typedef struct {
int *data;
int top;
} stack;
stack *new_stack(int cap);
void push(stack *st, int val);
int pop(stack *st);
int top(stack *st);
bool is_empty(stack *st);
void destroy_stack(stack *st);
typedef struct {
stack *data;
stack *help;
} queue;
queue *new_queue(int n);
void add(queue *q, int val);
int poll(queue *q);
int peek(queue *q);
void destroy_queue(queue *q);
static void move(queue *q);
int main(void) {
int n, x;
char opt[10];
scanf("%d", &n);
queue *q = new_queue(n);
for (int i = 0; i < n; i++) {
scanf("%s", opt);
if (strcmp(opt, "add") == 0) {
scanf("%d", &x);
add(q, x);
} else if (strcmp(opt, "poll") == 0) {
poll(q);
} else {
printf("%d\n", peek(q));
}
}
destroy_queue(q);
return 0;
}
stack *new_stack(int cap) {
stack *st = (stack *) malloc(sizeof(stack));
st->data = (int *) malloc(sizeof(int) * cap);
st->top = -1;
return st;
}
void push(stack *st, int val) {
st->data[++st->top] = val;
}
int pop(stack *st) {
return st->data[st->top--];
}
int top(stack *st) {
return st->data[st->top];
}
bool is_empty(stack *st) {
return st->top == -1;
}
void destroy_stack(stack *st) {
free(st->data);
free(st);
}
queue *new_queue(int n) {
queue *q = (queue *) malloc(sizeof(queue));
q->data = new_stack(n);
q->help = new_stack(n);
return q;
}
void add(queue *q, int val) {
push(q->data, val);
}
int poll(queue *q) {
if (is_empty(q->help)) {
move(q);
}
return pop(q->help);
}
int peek(queue *q) {
int x;
if (is_empty(q->help)) {
move(q);
}
x = top(q->help);
return x;
}
void destroy_queue(queue *q) {
destroy_stack(q->data);
destroy_stack(q->help);
free(q);
}
static void move(queue *q) {
if (!is_empty(q->help)) {
return;
}
while (!is_empty(q->data)) {
push(q->help, pop(q->data));
}
}