[英]Queue implemented with classes
我最近来排队数据结构。 为了练习和学习新东西,我决定在没有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;
我的问题很琐碎。 这是如何实现队列? 我能理解它吗,因为队列只是值的生成器/迭代器? 为什么要使用队列而不是数组呢? 另外,圆形队列的要点是什么?
感谢您的回答。
至少在C和C ++中,数组是用具体术语定义的。 具体来说,它是根据内存布局(连续内存位置的对象)定义的。 您如何使用它,如何使用它等等,完全取决于该定义。
队列的定义更加抽象:它必须支持几个特定的操作(添加和检索项目)以及两者之间的顺序关系(先进先出)。 通常还会提供一些辅助操作,例如检查队列是否为空或检查队列的当前大小(但通常不将其视为定义的一部分)。
您当然可以使用数组来实现队列。 您也可以使用链接列表。 虽然它可能没有了一大堆的道理,你也可以使用二叉树,多路树,混合如阵列,或基本的链表其他任何你能想到的,只要它支持所需的操作。
朝另一个方向发展,您不仅可以使用数组来实现队列,而且可以实现堆栈,双端队列,堆/优先级队列,循环缓冲区或任意数量的其他抽象。
至于您的特定问题:“这是如何实现队列”? 我一般地说,不。 仅举一个例子,您就忽略了三巨头的法则,因此分配,复制和销毁对您的队列实际上并不起作用(但是您并未阻止分配或复制)。 您还使用了new[]
来分配队列的空间,该空间在分配后立即将对象构造到该空间中。 对于像int
这样的原始对象队列来说,这很好,但是通常来说并不是那么好。 同样,您的队列可以打印出一条消息以响应isEmpty()
。 假设它完全存在, isEmpty
应该只返回一个值以指示队列是否为空-如果需要打印的消息,则应由其他代码处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.