如下:
#include<iostream>
#include"queue.h"
using namespace std;
int main() {
Queue<int> q(7);
q.EnQueue(0);
q.disPlay();
q.EnQueue(1);
q.disPlay();
q.EnQueue(2);
q.disPlay();
q.EnQueue(3);
q.disPlay();
q.EnQueue(4);
q.disPlay();
q.EnQueue(5);
q.disPlay();
q.EnQueue(6);
q.disPlay();
q.EnQueue(7);//该函数返回为false
q.disPlay();
return 0;
}
程序运行如下:
在执行q.EnQueue(7)的时候,该函数返回了一个false,这是意料之中的,但是没有想到的是,最后一个q.display();没有被执行。
这是为什么呢?
最开始我以为可能是q.EnQueue(7);返回了一个false,这可能相当于语句return 0;所以main函数提前结束。
可是当我写了另外一个函数来测试时,我发现了自己的错误。
#include<iostream>
#include"queue.h"
using namespace std;
bool is(int i);
int main() {
/*
Queue<int> q(7);
q.EnQueue(0);
q.disPlay();
q.EnQueue(1);
q.disPlay();
q.EnQueue(2);
q.disPlay();
q.EnQueue(3);
q.disPlay();
q.EnQueue(4);
q.disPlay();
q.EnQueue(5);
q.disPlay();
q.EnQueue(6);
q.disPlay();
q.EnQueue(7);
q.disPlay();
*/
int i = 0;
is(i);
cout << "hello world!" << endl;
return 0;
}
bool is(int i) {
if (!i)
return false;
return true;
}
如上,程序运行的结果是:
这也就直接否定了我的猜测。
于是我去查看我的queue.h中是不是有逻辑错误,果然被我找到了。
template<class T>
void Queue<T>::disPlay() {
if (!tag) {
cout << "队列为空!" << endl;
return;
}
for (int i = front;; i = (i + 1) % maxSize) {
if (i == rear)
break;
cout << queue[i] << " ";
}
cout << endl;
}
在我的display()函数中忘记了考虑一个情况:当输出的队列本身就已经满了的情况下(也就是front==rear),这个循环直接就break;掉了,所以压根就不会执行最后一个display()函数。
所以改进如下:
template<class T>
void Queue<T>::disPlay() {
if (!tag) {
cout << "队列为空!" << endl;
return;
}
if (front == rear&&tag) {
for (int i = 0; i < maxSize; i++) {
cout << queue[i] << " ";
}
}
for (int i = front;; i = (i + 1) % maxSize) {
if (i == rear)
break;
cout << queue[i] << " ";
}
cout << endl;
}
这回,程序该正常运行了吧,嘿嘿。
果不其然: