队列详细讲解
队列是一种先进先出的线性表,它只允许在表的一段进行插入元素,在表的另一端删除元素,先进先出,插入的一端叫做队尾(back),删除的一段叫做对头(front)
队列定义在<queun>头文件中
下面代码是队列成员的函数原型:
//-----容量capacity-----
bool empty();//测试是否为空队列
size_type size();//返回队列长度
//-----元素存取element access----
front();//返回对头元素
back();//返回队尾元素
//----队列运算----
void push(const T& x);//插入一个元素到队尾
void pop();//删除队列下一个元素
队列应用举例:
先看代码:
#include<iostream>
#include<queue>
using namespace std; //队列定义在命名空间
int main()
{
queue<int> Q;
for (int i = 1; i <= 6; i++) Q.push(i); //队列Q:1 2 3 4 5 6
Q.front() -= Q.back();//Q:-5 1 2 3 4 5
while (!Q.empty()) {
cout << Q.front() << " ";
Q.pop(); //出队
}
return 0;
}
用队列的方法来解决实际问题:
例题:桌上有一叠牌,从第一张牌 开始从上往下依次编号1~n。当至少还剩两张牌时进行如下的操作:
把第一张牌扔掉,然后把新的第一张牌放到整碟牌的最后。输入总牌数,输出每次扔掉的牌,以及最后剩下的两张牌
例如:总牌数为7
输入:7
输出:1 3 5 7 4 2 6
1 2 3 4 5 6 7
3 4 5 6 7 2
5 6 7 2 4
7 2 4 6
4 6 2
2 6
解题代码如下:
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int> q; //声明队列
int n; //输出总的牌数
cin >> n;
for (int i = 0; i < n; i++)
q.push(i + 1); //将1~7放到队列里面去
while (q.size() > 2)
{
cout << q.front() << " "; //输出队列第一个元素
q.pop(); //将队列第一个元素出队
q.push(q.front()); //将现队列第一个元素放入到队尾
q.pop(); //现队列的第一个元素出队
}
cout << endl;
while (!q.empty())
{
cout << q.front() << " "; //输出队列中剩余的元素
q.pop();
}
return 0;
}