E_BAEK 2022-11-10 08:45 采纳率: 50%
浏览 85
已结题

关于#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啊?

  • 写回答

1条回答 默认 最新

  • .LAL. C/C++领域新星创作者 2022-11-10 10:05
    关注
    
    #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;
    }
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月12日
  • 修改了问题 11月10日
  • 修改了问题 11月10日
  • 创建了问题 11月10日

悬赏问题

  • ¥15 报酬10000,做一个简单的换汇网站
  • ¥15 关于#vue.js#的问题:word excel和ppt预览问题语言-javascript)
  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢