Mareeohh 2020-04-23 10:29 采纳率: 0%
浏览 182

队列模板出队列指针的问题

using namespace std;
template<class T>
class Queue {
public:Queue(int size=0);
      Queue(const Queue<T>& q);
      virtual~Queue();
      void In(T n);
      const T Out();
      bool Empty()const;
      bool Full()const;
private:int max; T* Front, * Tail;
};
template<class T>
Queue<T>::Queue(int size)
{
    Front=Tail = new T[(max = size)+1];
}
template<class T>
Queue<T>::Queue(const Queue<T>& q)
{
    Front = new T[(max = q.max)+1];
    Tail = Front + (int(q.Tail - q.Front));
    for (int i = 0; i < int(Tail - Front); i++)
    {
        Front[i] = q.Front[i];
    }
}
template<class T>
Queue<T>::~Queue()
{
    delete[]Front;
}
template<class T>
const T Queue<T>::Out()
{
    if (Tail == Front)
    {
        cout << "overflow" << endl;
        return -1;
    }
    else
    {
        return *(Front++);                        //返回出队的该元素
    }
}
template<class T>
void Queue<T>::In(T n)
{
    if (int(Tail - Front) >= max)
        cout << "overflow" << endl;
    else *(Tail++) = n;
}
template<class T>
bool Queue<T>::Empty()const
{
    return Front == Tail;
}
template<class T>
bool Queue<T>::Full()const
{
    return int(Tail - Front) == max;
}
int main()
{
    Queue<int>Queue1(10); Queue<double>Queue2(10);
    for (int i = 2; i < 5; i++)
        Queue1.In(i);
    for (double i = 0; i < 8; i++)
        Queue2.In(i);
    cout << Queue1.Out();  //这里出现问题

}

在执行Out操作的时候,release能编译通过,但是debug就是显示
图片说明
如果完美解决的话可以微信支付10y

  • 写回答

1条回答 默认 最新

  • 白色一大坨 2020-04-23 12:25
    关注

    你这个程序既然是指定大小的循环队列,那么头和尾指针应该和队列本身的动态分配地址分开,不然导致你出队后,队列指针变化,无法正确释放分配的空间。

    #include <iostream>
    using namespace std;
    template<class T>
    class Queue {
    public:Queue(int size = 0);
           Queue(const Queue<T>& q);
           virtual~Queue();
           void In(T n);
           const T Out();
           bool Empty()const;
           bool Full()const;
    private:int max; T* Front, *Tail, *Qdata;
    };
    template<class T>
    Queue<T>::Queue(int size)
    {
        Qdata = new T[size];
        Front = Tail = Qdata;
        max = size;
    }
    template<class T>
    Queue<T>::Queue(const Queue<T>& q)
    {
        Front = new T[(max = q.max) + 1];
        Tail = Front + (int(q.Tail - q.Front));
        for (int i = 0; i < int(Tail - Front); i++)
        {
            Front[i] = q.Front[i];
        }
    }
    template<class T>
    Queue<T>::~Queue()
    {
        delete[]Qdata;
    }
    template<class T>
    const T Queue<T>::Out()
    {
        if (Tail == Front)
        {
            cout << "overflow" << endl;
            return -1;
        }
        else
        {
            return *(Front++);                        //返回出队的该元素
        }
    }
    template<class T>
    void Queue<T>::In(T n)
    {
        if (int(Tail - Front) >= max)
            cout << "overflow" << endl;
        else *(Tail++) = n;
    }
    template<class T>
    bool Queue<T>::Empty()const
    {
        return Front == Tail;
    }
    template<class T>
    bool Queue<T>::Full()const
    {
        return int(Tail - Front) == max;
    }
    int main()
    {
        Queue<int>Queue1(10); Queue<double>Queue2(10);
        for (int i = 2; i < 5; i++)
            Queue1.In(i);
        for (double i = 0; i < 8; i++)
            Queue2.In(i);
        cout << Queue1.Out();  //这里出现问题
    
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器