m0_74793916 2023-04-03 20:51 采纳率: 66.7%
浏览 14
已结题

循环队列虚假的“出队列”问题

循环队列里面的“出队列”其实就是头指针的移动,但是这样的话会出现问题就是,该部分的空间其实并没有被释放,那么以下情况中结果输出的队尾元素是本来应该已经“出队列”的数据。这是怎么回事呢?

#include<stdio.h>
#include<malloc.h>
#include<iostream>
using namespace std;
#define MAXQSIZE 6
#define ERROR -1
#define OK 1

typedef struct {
    int* base;
    int front;
    int rear;
}SqQueue;
int InitQueue(SqQueue& Q)
{
    Q.base = (int*)malloc(MAXQSIZE * sizeof(int));
    if (!Q.base)return ERROR;
    Q.front = Q.rear = 0;
    return OK;
}
int QueueLength(SqQueue& Q)
{
    return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
int EnQueue(SqQueue& Q, int e)
{
    if ((Q.rear + 1) % MAXQSIZE == Q.front)return ERROR;
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXQSIZE;
    return OK;
}
int DeQueue(SqQueue& Q, int e)//出队
{
    if (Q.front == Q.rear)return ERROR;
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAXQSIZE;
    return OK;
}
int main()
{
    SqQueue Q;
    InitQueue(Q);
    int e[3] = { 7,8,9 };
    for (int i = 0; i < 3; i++)
    {
        EnQueue(Q, e[i]);
    }
    int m[2] = { 0 };
    for (int i = 0; i < 2; i++)
    {
        DeQueue(Q, m[i]);
    }
    int n[4] = { 0,1,2,3 };
    for (int i = 0; i < 4; i++)
    {
        EnQueue(Q, n[i]);
    }
    cout << Q.base[Q.front] << ' ' << Q.base[Q.rear] << endl;
}

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-04-03 21:16
    关注

    目测存在2个问题,一个是出队操作 DeQueue 的实现有误,它应该返回出队元素的值,而不是返回状态值
    另一个问题是最后输出队头和队尾元素时,代码没有考虑到队列可能为空的情况,会导致访问未定义的内存。应先判断队列的长度是否大于 0,再输出队头和队尾元素。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月13日
  • 已采纳回答 4月5日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大