我最近排队数据结构。为了练习和学习新东西,我决定在没有STL库的情况下实现它。问题是,我很难真正区分典型的数组和队列。
我定义了简单的类
class Queue{
public:
Queue();
Queue(int);
void enqueue(int);
int dequeue();
int first_out() ;
int last_out() ;
bool isEmpty();
bool isFull();
private:
int current;
int maxi;
int *arr;
int frontt;
int rear;
};
其构造函数
Queue::Queue(int maxo){
this -> current = 0;
this -> maxi = maxo;
this -> arr = new int[maxi];
this -> frontt = 0;
this -> rear = 0;
}
enqueue方法,当它尝试访问大于最大索引的索引时,重新分配内部数组。
void Queue::enqueue(int a){
if( this -> rear == this -> maxi){
int *temp;
int tmp = maxi;
while( this -> rear >= this -> maxi){
this -> maxi *= 2;
}
temp = new int[maxi];
for( int i = 0; i < tmp ; i++){
temp[i]=arr[i];
}
rear = maxi;
delete[] arr;
arr = temp;
}
this -> arr[rear++] = a;
}
将哪个增量前索引出列。
int Queue::dequeue(){
return arr[frontt++];
}
int Queue::first_out(){
return arr[frontt];
}
int Queue::last_out(){
return arr[rear-1];
}
bool Queue::isEmpty(){
if( this -> frontt == this -> rear){
cout << "Queue is empty" << endl;
return 1;
}
return 0;
}
bool Queue::isFull(){
if( this -> frontt == (this -> rear+1) % this -> maxi){
return 1;
}
return 0;
}
测试它的主要功能
Queue tst(5);
cout << "Write numbers" << endl;
int n;
while( cin >> n){
tst.enqueue(n);
}
tst.dequeue();
cout << "The firt out element is " << tst.first_out() << endl;
cout << "The last out element is " << tst.last_out() << endl;
return 0;
我的问题非常简单。这是如何实现队列的?我能理解它,因为队列只是值的生成器/迭代器吗?为什么要使用队列代替数组呢?圈队列的重点是什么?
感谢您的回答。
答案 0 :(得分:0)
至少在C和C ++中,数组是用具体的术语定义的。具体来说,它是根据内存布局定义的 - 连续内存位置的对象。你如何使用它,你用它做什么等等,完全取决于这个定义。
更抽象地定义队列:它必须支持几个特定的操作(添加和检索项)以及两者之间的顺序关系(先进先出)。还经常提供一些辅助操作,例如检查队列是否为空,或检查其当前大小(但通常不会将其视为定义的一部分)。
您当然可以使用数组来实现队列。您还可以使用链接列表。虽然它可能没有多大意义,但还可以使用二叉树,多路树,混合(如数组的链接列表),或者基本上你可以想到的任何其他东西,只要它支持所需的操作。
走向另一个方向,您可以使用数组不仅实现队列,还可以实现堆栈,双端队列,堆/优先级队列,循环缓冲区或任意数量的其他抽象。
关于你的具体问题:&#34;这是如何实现队列&#34;?我一般说不,不。举一个例子,你忽略了三巨头的法则,因此分配,复制和破坏对你的队列并不起作用(但你也没有阻止任务或复制)。您还使用new[]
来分配队列的空间,该空间在分配时立即将对象构建到该空间中。这对于像int
这样的原始对象的队列来说很好,但总的来说不是很好。同样,您的队列可以打印出一条消息以响应isEmpty()
。假设它完全存在,isEmpty
应该只返回一个值来指示队列是否为空 - 如果需要打印的消息,应由其他代码处理。