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 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计