鸡蛋队列(数组,函数)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
将两根筷子平行的放在一起,就构成了一个队列。将带有编号的鸡蛋放到两根筷子之间叫做入队(push),将筷子之间的鸡蛋拿出来叫做出队(pop)。但这两种方式有特殊的定义,对于入队,只能将鸡蛋从队列的尾部向里放入;对于出队,只能将鸡蛋从队列的头部向外将鸡蛋拿出来。
将①、②入队:
1 2 3 | 头____________尾 _____________ ______________ ← ① ← ② ① ← ② ① ② ______________ _____________ ______________ |
将①、②出队:
1 2 3 | 头____________尾 ______________ ______________ ← ① ← ② ① ← ② ① ② ______________ ______________ ______________ |
输入
第一行输入一个数T,表示有T组数据 第二行输入一个数N,表示有N(N<=10)种操作 接下来N行,每行一种操作,push表示将编号为x的鸡蛋放入队列中,pop表示拿走队列头部的一个鸡蛋。 数据输入保证合法,队列中没有鸡蛋时不会有出队操作!
输出
输出N种操作完之后,队列中蛋蛋的编号,如果没蛋了,就输出"no eggs!"(不包括引号)每组输出占一行。
样例输入
1 2 3 4 5 6 7 8 | 2 3 push 1 push 2 push 3 2 push 1 pop |
样例输出
1 2 | 1 2 3 no eggs! |
提示
数组模拟队列,用下标记录对头、队尾位置。
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <stdio.h> struct Queue { int data[32]; int head, tail; }; void push(struct Queue *queue, int data); void pop(struct Queue *queue); void show(struct Queue *queue); int main() { int ctrl; scanf("%d", &ctrl); while (ctrl--) { struct Queue queue = {}; int time; scanf("%d", &time); while (time--) { char operation[8]; scanf("%s", operation); if (operation[1] == 'u') { int data; scanf("%d", &data); push(&queue, data); } else { pop(&queue); } } show(&queue); } return 0; } void push(struct Queue *queue, int data) { queue->data[queue->tail] = data; queue->tail += 1; } void pop(struct Queue *queue) { queue->head += 1; } void show(struct Queue *queue) { if (queue->head == queue->tail) { printf("no eggs!\n"); } else { printf("%d", queue->data[queue->head]); for (int i = queue->head + 1; i != queue->tail; ++i) { printf(" %d", queue->data[i]); } printf("\n"); } } |