模拟队列(C语言)
为什么输出为0?
实现一个队列,队列初始为空,支持四种操作:
1.push x – 向队尾插入一个数 x;
2.pop – 从队头弹出一个数;
3.empty – 判断队列是否为空;
4.query – 查询队头元素。
现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。
输入格式:
第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。
输出格式:
对于每个 empty 和 query 操作都要输出一个查询结果,每个结果占一行。
其中,empty 操作的查询结果为 YES 或 NO,query 操作的查询结果为一个整数,表示队头元素的值。
数据范围:
1≤M≤100000,
1≤x≤10
9
,
所有操作保证合法。
输入样例:
在这里给出一组输入。例如:
10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6
输出样例:
在这里给出相应的输出。例如:
NO
6
YES
4
代码长度限制
16 KB
时间限制
2000 ms
内存限制
64 MB
#include <stdio.h>
#include <string.h>
int main(){
int a[100000];
int head=0,tail=-1;
char ch[6];
int m,x;
scanf("%d",&m);
while(m--){
scanf("%s",&ch);
int l=strlen(ch);
if(l==4){
scanf("%d",&x);
a[tail++]=x;}
if(l==3)
head++;
if(ch[0]=='e'){
if(head<=tail)
printf("NO\n");
else
printf("YES\n");}
if(ch[0]=='q')
printf("%d\n",a[head]);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define maxSize 5
typedef struct{
int queue[maxSize];
int rear; //队尾
int front; //对头
}Struct_ArrayQueue; //队列结构体
//初始化队列
void QueueInitiate(Struct_ArrayQueue *Q){
memset(Q->queue, 0x00, sizeof(Q->queue)); //初始化队列
Q->front = -1; //初始化对头 ,指向队列头部的前一个位置
Q->rear = -1; //初始化队尾 ,指向队列尾部的具体数据
}
//判断队列满
int isFull(Struct_ArrayQueue Q){
if(Q.rear == maxSize - 1)
return 1; //队列满返回1
else
return 0; //队列没满返回0
}
//判断队列是否空
int isEmpty(Struct_ArrayQueue Q){
if(Q.rear == Q.front)
return 1; //队列空返回1
else
return 0; //队列不空返回0
}
//添加数据到队列
int addQueue(Struct_ArrayQueue *Q, int n) {
if(Q->rear == maxSize - 1) { //判断队列是否满,满了就无法添加数据
printf("队列已满无法添加数据\n");
return 0;
}
Q->rear++; //rear后移
Q->queue[Q->rear] = n;
return 1;
}
//数据出队列, 取数据
int getQueue(Struct_ArrayQueue *Q, int *d){
//判断队列是否空
if(Q->rear == Q->front){
printf("队列为空,无数据出队列\n");
return 0;
}
Q->front++; //front后移
*d = Q->queue[Q->front]; //将数据传给d,让d带回main函数
Q->queue[Q->front] = 0; //取出后赋值为0
return 1;
}
//显示队列所有数据
void showQueue(Struct_ArrayQueue Q){
int i;
//判断是否为空
if(isEmpty(Q))
printf("队列为空,没有数据\n");
else{
for(i = 0; i < sizeof(Q.queue)/sizeof(Q.queue[0]); i++){
printf("arr[%d] = %d\n", i, Q.queue[i]);
}
}
}
//显示对头数据, 注意不是取出
int headQueue(Struct_ArrayQueue Q, int *d){
//判断是否为空
if(isEmpty(Q)){
printf("队列为空,无对头数据可显示\n");
return 0;
}
*d = Q.queue[Q.front + 1];
return 1;
}
int main(int argc, char *argv[]) {
//测试数据
Struct_ArrayQueue Q;
int loop = 1, value, res;
char key;
//初始化队列
QueueInitiate(&Q);
while(loop) {
printf("s(show): 显示队列\n");
printf("e(exit): 退出程序\n");
printf("a(add): 添加数据到队列\n");
printf("g(get): 从队列里面取数据\n");
printf("h(head): 查看队列头的数据\n");
key = getchar();
switch(key){
case 's': //显示队列
showQueue(Q);
break;
case 'a': // 添加数据到队列
scanf("%d", &value);
addQueue(&Q, value);
break;
case 'g': //从队列里面取数据
if(getQueue(&Q, &res)){
printf("取出的数据是:%d\n", res);
}
break;
case 'h': //查看队列头的数据
if(headQueue(Q, &res)){
printf("当前对列头的数据是:%d\n", res);
}
break;
case 'e':
loop = 0;
break;
default:
break;
}
getchar(); //吸收回车,避免前面的目录两次输出
}
printf("程序退出\n");
return 0;
}