问题描述
- 请问我写的C++基于循环数组的队列 代码错在哪里,老是答案错
-
正常出队列返回success,空队列返回underflow, 满队列返回overflowenum ErrorCode { success, underflow, overflow }; const int maxQueue = 100; template <class QueueEntry> class MyQueue { public: MyQueue(){ front = rear = 0; } // 判断队列是否为空 bool empty() const{ return rear == front; } // 入队操作 ErrorCode append(const QueueEntry &item){ if(!full()){ entry[rear] = item; rear = (rear+1)%100; return success; } else return overflow; } // 出队操作 ErrorCode serve(){ if(!empty()) { front = (front+1)%100; return success; } else return underflow; } // 获取队头元素 ErrorCode retrieve(QueueEntry &item) const{ return success; } // 判断队列是否已满 bool full() const{ return ((rear + 1) % 100 == front); } // 获取队列已有元素个数 int size() const{ return (rear - front + 100)%100; } // 清除队列所有元素 void clear(){ rear = front = 0; } // 获取队头元素并出队 ErrorCode retrieve_and_serve(QueueEntry &item){ if(!empty()) { item = entry[front]; front = (front+1)%100; return success; } else return underflow; } private: int front; // 队头下标 int rear; // 队尾下标 QueueEntry entry[100]; // 队列容器 };
解决方案
你这只是实现的代码,调用的代码呢?
只有看到调用的代码,才有可能知道你想实现什么功能
当然最好你是你说明一下调用代码想实现的目标,但实际执行后又是什么效果,这样才好分析。
解决方案二:
你这只是实现的代码,调用的代码呢?
只有看到调用的代码,才有可能知道你想实现什么功能
当然最好你是你说明一下调用代码想实现的目标,但实际执行后又是什么效果,这样才好分析。
解决方案三:
我只想说说自己的理解
1.循环数组队列,边界下标控制做的不错,但是为什么逻辑判断时候没有考虑进去?
a 初始0 0 那如果我加入了99个QueueEntry 之后呢?是不是又是0 0了?,这个时候你大部分函数都非正常工作了
b 设计逻辑问题,保存的类对象的拷贝,所以所谓的“清除队列所有元素”没有任何用,只是对那些任然存在的数据‘撒手不管’了而已
c 考虑下这个情况:我先入队列3个,再出队列2个,你猜现在是不是空的?如果我如队列99个,在出98个呢?这个时候是不是满的?
.................
此处略去....
解决方案四:
队列这个东西 要自己实现的话 应该牺牲掉一个存储单位,用于方便判断是满还是空,队尾+1=队首 ->满 队尾 = 队首-> 空
解决方案五:
哪里有问题,我试了一下输出没问题呀
解决方案六:
貌似没有问题啊啊啊啊啊
时间: 2024-10-14 23:04:31