You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言队列Peek操作异常求助:无法获取非空队列的队首元素

修复队列Peek操作的问题

你的代码中Peek功能失效主要源于三个核心错误,下面逐个拆解并修复:

问题1:Peek的空队列判断逻辑错误

初始化时front和rear均为-1,第一次入队后rear变为0,但front仍保持-1。此时Peek里的*front == -1条件会触发,错误判定队列为空。正确的空队列判断应该和Dequeue逻辑统一:*front == *rear(初始状态两者相等表示为空,入队后front < rear表示队列非空)。

问题2:Peek函数的返回值逻辑完全错误

  • 你定义Peek返回int类型,却试图返回字符串,类型完全不匹配;
  • 代码里return data[*front];是取传入临时数组的单个字符,完全没用到存储队列元素的name数组,逻辑颠倒。

正确做法是:通过传入的data参数复制队首元素,返回1表示成功,-1表示失败。

问题3:Main函数中Peek的调用和打印错误

你把Peek返回的int值用%s格式符打印,会导致未定义行为(把整数当作内存地址访问)。应该通过传入的data数组获取并打印队首元素。


修正后的完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 100

// 修正函数声明,匹配定义的参数列表
int enqueue(char name[max][80], int *rear, char data[80]);
int dequeue(char name[max][80], int *front, int *rear, char data[80]);
int peek(char name[max][80], int *front, int *rear, char data[80]);
void display();

int main()
{
      char name[max][80], data[80];
      int front, rear, value;
      int ch;
      front = rear = -1;
        printf("------------------------------\n");
        printf("\tMenu");
        printf("\n------------------------------");
        printf("\n [1] ENQUEUE");
        printf("\n [2] DEQUEUE");
        printf("\n [3] PEEK");
        printf("\n [4] DISPLAY");
      printf("\n------------------------------\n");
      while(1)
      {
            printf("Choice : ");
            scanf("%d", &ch);
            switch(ch)
            {
                  case 1 : // 入队
                        printf("\nEnter the Name : ");
                        scanf("%s",data);
                        value = enqueue(name, &rear, data);
                        if(value == -1 )
                              printf("\n QUEUE is Full \n");
                        else
                              printf("\n'%s' is inserted in QUEUE.\n\n",data);
                        break;
                  case 2 : // 出队
                        value = dequeue(name, &front, &rear, data);
                        if( value == -1 )
                              printf("\n QUEUE is Empty \n");
                        else
                        {
                              printf("\n Deleted Name from QUEUE is : %s\n", data);
                              printf("\n");
                        }
                        break;
                 case 3: // 查看队首
                    value = peek(name, &front, &rear, data);
                    if(value != -1)
                    {
                        printf("\n The front is: %s\n", data);
                    }
                    break;
                  case 5 : exit(0);
                  default: printf("Invalid Choice \n");
            }
      }
      return 0;
}

int enqueue(char name[max][80], int *rear, char data[80])
{
      if(*rear == max -1)
            return(-1);
      else
      {
            *rear = *rear + 1;
            strcpy(name[*rear], data);
            return(1);
      }
}

int dequeue(char name[max][80], int *front, int *rear, char data[80])
{
      if(*front == *rear)
            return(-1);
      else
      {
            (*front)++;
            strcpy(data, name[*front]);
            return(1);
      }
}

int peek(char name[max][80], int *front, int *rear, char data[80])
{
     if(*front == *rear) // 修正空队列判断逻辑
     {
         printf(" QUEUE IS EMPTY\n");
         return -1;
     }
     else
     {
         // 队首元素的索引是front+1(初始front=-1时,对应第一个元素索引0)
         int front_pos = *front + 1;
         strcpy(data, name[front_pos]);
         return 1;
     }
}

关键修改说明

  1. 统一空队列判断:Peek函数使用和Dequeue一致的*front == *rear作为空队列判定条件,避免初始入队后的误判。
  2. 修正Peek逻辑:通过strcpy将name数组中对应队首位置的元素复制到传入的data数组,返回成功状态。
  3. 修复打印逻辑:Main函数中Peek调用成功后打印data数组,解决类型不匹配的问题。
  4. 补全函数声明:给所有函数补充完整参数列表,消除编译器隐式声明警告。

内容的提问来源于stack exchange,提问作者anna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:50:25