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; } }
关键修改说明
- 统一空队列判断:Peek函数使用和Dequeue一致的
*front == *rear作为空队列判定条件,避免初始入队后的误判。 - 修正Peek逻辑:通过
strcpy将name数组中对应队首位置的元素复制到传入的data数组,返回成功状态。 - 修复打印逻辑:Main函数中Peek调用成功后打印
data数组,解决类型不匹配的问题。 - 补全函数声明:给所有函数补充完整参数列表,消除编译器隐式声明警告。
内容的提问来源于stack exchange,提问作者anna
相关产品推荐
相关产品推荐

