正常出队列返回success,空队列返回underflow, 满队列返回overflow
enum 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=队首 ->满 队尾 = 队首-> 空
哪里有问题,我试了一下输出没问题呀
貌似没有问题啊啊啊啊啊