队列
队列(Queue):先入先出(IFO,First In First Out)
头文件< queue >
队列的声明
queue < type > s
队列的操作
q.push(x) 把x放入队列(增)
q.pop() 删除队首元素(删)
q.front() 返回队首元素
q.back() 返回队尾元素
q.size() 返回元素个数
q.empty() 返回队列是否为空
q.swap() 交换两个队列的元素
q1=q2 赋值
用数组实现队列
initialize()
head=tail=0;
isEmpty()
return head==tail;
isFull()
return head=(tail+1) % MAX //实现循环队列
Push()
if isFull() 上溢
q[tail]=x;
if(tail+1==MAX)
tail=0;
else
tail++;
Pop()
if isEmpty() 下溢
x=q[head];
if(head+1==MAX)
head=0;
else
head++;
return x;
特殊队列
优先队列 priority_queue
优先队列:增删元素后自动排序的队列,默认从大到小
头文件 < queue >
声明方式
从小到大的队列:priority_queue< int,vector ,greater > q1;
从大到小的队列:priority_queue< int,vector ,less > q2;
重定义排序
bool operator<(const node &b) const{ }
操作
q.push(x) 将x入队
q.pop() 删除队首元素
q.top() 返回队顶元素
q.size() 返回优先队列中元素个数
q.empty() 返回队列是否为空
双端队列
双端队列是指一个可以在队首/队尾插入或删除元素的队列。相当于是栈与队列功能的结合。
头文件 < deque >
操作
q.front() 返回队首元素
q.back() 返回队尾元素
q.pushback() 在队尾插入元素
q.popback() 弹出队尾元素
q.push_front() 在队首插入元素
q.pop_front() 弹出队首元素
q.insert() 在指定位置前插入元素(传入迭代器和元素)
q.erase() 删除指定位置的元素(传入迭代器)
q.empty() 队列是否为空
q.size() 返回队列中元素的数量
q.resize(num,elem); 重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末 尾超出容器长度的元素被删除。
q1=q2 赋值
q[i] 访问元素
循环队列
使用数组模拟队列会导致一个问题:随着时间的推移,整个队列会向数组的尾部移动,一旦到达数组的最末端,即使数组的前端还有空闲位置,再进行入队操作也会导致溢出(这种数组里实际有空闲位置而发生了上溢的现象被称为“假溢出”)。
解决假溢出的办法是采用循环的方式来组织存放队列元素的数组,即将数组下标为 0 的位置看做是最后一个位置的后继。
(数组下标为 x 的元素,它的后继为 (x + 1) % SIZE)。这样就形成了循环队列。