队列概念:
只允许在队尾进行插入操作,在队头进行删除操作,具有先进先出的特性。
队列分为顺序队列以及链表队列,顺序队列分为队头不动与队头移动量种。
今天一篇讨论队头不动的顺序队列。
在图中我们可以看出队头front始终指向0,rear始终指向实际大小的位置,因此在进行队尾插入时较为容易,但在队头删除时需要进行搬移数据,耗费时间。由于队头始终指向0,因此不会出现假溢出现象。
因此,这样的顺序队列适合哪种入队较多,出队较少的队列。
下面的代码中,front始终为下标0,rear始终为Size()的大小,因此没有用front和rear这两个变量,但实际蕴含其中。
//队头不动,不会出现假溢出现象,但搬移数据较为困难
//顺序队列
#include<iostream>
using namespace std;
typedef int typedata;
#define max_size 100
typedef class Seqlist{
public:
Seqlist(int size = 0, int capacity = max_size)
:_size(size),
_capacity(capacity)
{}
int Size()
{
return _size;
}
//入队列,队尾插入
bool push_back(typedata data)
{
if (_size > _capacity)
{
cout << "队列已满" << endl;
return false;
}
array[_size++] = data;
return true;
}
//出队列,队头删除,需要数据搬移
bool pop_front()
{
if (_size == 0)
return false;
int i = 0;
for (i = 1; i < _size; ++i)
array[i-1] = array[i];
_size--;
return true;
}
~Seqlist()
{
if (_size != 0)
_size = 0, _capacity = 0;
}
void 打印()
{
int i = 0;
cout << "队头" << " : ";
for (i = 0; i < _size; ++i)
{
if (i % 10 == 0)
cout << endl;
cout << array[i] << " ";
}
cout << "队尾" << endl;
}
private:
typedata array[max_size];
int _size;
int _capacity;
};
#include<time.h>
#include<iostream>
using namespace std;
//用当前产生随机数组
void time_srandd(int array[], int n)
{
srand((unsigned)time(NULL)); //用当前时间设置种子
int i = 0;
for (; i < n; ++i)
{
array[i] = rand() % n;
}
}
void test()
{
Seqlist p;
int array[100];
time_srandd(array, 100);//用随机数入队
int i = 0;
for (i = 0; i < 100; ++i)
p.push_back(array[i]);
cout << "Size:" << p.Size() << endl;
p.打印();
cout << endl;
for (i = 0; i < 40; ++i)
p.pop_front();
cout << "Size:" << p.Size() << endl;
p.打印();
for (i = 0; i < 20; ++i)
p.push_back(array[i]);
cout << "Size:" << p.Size() << endl;
p.打印();
}
int main()
{
test();
return 0;
}