关于#C语言#模拟队列#的问题,如何解决?

模拟队列(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;
}

img


为什么输出为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;
}