二、数据结构第二节——队列
和学习栈的思路一样,首先我们来用数组的方式实现队列。
借此帮助我们更好的理解“队列”的构成。
例一
代码源-107
#include <bits/stdc++.h>
using namespace std;
int m,q[100010];
int front = 1, rear = 0;
char str[1010];
int main()
{
scanf("%d", &m);
for ( int i = 0; i < m; i++ ){
int x;
scanf("%s%d", str, &x);
if ( str[2] == 's' ) {
q[++rear] = x;
}else if( str[0] == 'p' ) {
++front;
} else{
printf("%d\n", q[front + x - 1]);
}
}
return 0;
}
同样的,对应操作可以由头文件#include <queue>
中对应函数代替
#include <bits/stdc++.h>
using namespace std;
int m,q[100010];
que
int front = 1, rear = 0;
char str[1010];
int main()
{
scanf("%d", &m);
for ( int i = 0; i < m; i++ ){
int x;
scanf("%s%d", str, &x);
if ( str[2] == 's' ) {
q[++rear] = x; //q.push(x);
}else if( str[0] == 'p' ) {
++front; //q.pop();
} else{
printf("%d\n", q[front + x - 1]);
} //在这里一样暴露出其局限性,无法直接用队列函数查询元素。
}
return 0;
}
此后的stl代码将直接以注释形式给出
例二
代码源-202
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int x,k;
int front = 1, rear = 0;
//queue<int> q;
int q[200010];
int main()
{
scanf("%d %d", &x, &k);
q[++rear] = x;
//q.push(x);
for ( int i = 0; i < k; i++ ){
int z = 2 * q[front];
int c = z + 1;
//int z = 2 * q.front();
//int c = z + 1;
q[++rear] = z;
q[++rear] = c;
//q.push( z );
//q.push( c );
//printf("%d\n", q.front() );
printf("%d\n", q[front] );
//q.pop();
++front;
}
return 0;
}
例三
代码源-203
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int front = 1, rear = 0;
queue<int> qq;
int q[1000001];
int a[1000001];
int n;
int main()
{
scanf("%d", &n); //共有n个数
for ( int i = 0; i <n; i++ ){ //依次对每个数进行分析
int x;
scanf("%d", &x); //读入每次需要分析的数x
for ( ; rear >= front && q[front] < x - 5; front++ );
// 保证 队尾 > 队首 即队列中存在元素
// 且此时队首元素(最小) 也大于等于 x-5
//否则删除队首元素(去掉小于 x-5 的元素)
printf("%d ", rear - front + 1 ); //输出队列中大于等于x的元素个数
q[++rear] = x; //将x插入队尾
}
return 0;
}
例四
代码源-203
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int front = 1, rear = 0;
queue<int> qq;
int q[1000001];
int a[1000001];
int n;
int main()
{
scanf("%d", &n); //共有n个数
for ( int i = 0; i <n; i++ ){ //依次对每个数进行分析
int x;
scanf("%d", &x); //读入每次需要分析的数x
for ( ; rear >= front && q[front] < x - 5; front++ );
// 保证 队尾 > 队首 即队列中存在元素
// 且此时队首元素(最小) 也大于等于 x-5
//否则删除队首元素(去掉小于 x-5 的元素)
printf("%d ", rear - front + 1 ); //输出队列中大于等于x的元素个数
q[++rear] = x; //将x插入队尾
}
return 0;
}
例5
代码源-204
#include <iostream>
using namespace std;
int front = 1, rear = 0;
int n;//n个人排队
int a[1001];//n个人还需要的票数
int b[1001];//n个人出队时间
int q[1000001];//队列长度 n*n
int main()
{
scanf("%d", & n);
//读入人数
for ( int i = 0; i < n; i++ )
scanf("%d", &a[i]);
//依次读入每个人对票的需求
for ( int i = 0; i < n; i ++ ){
q[++rear] = i;
}// n个人入队
int cnt = n; //队内人数
for ( int i = 0; cnt ; i++ ){
--a[q[front]]; //队首买票,需求-1
if ( a[q[front]] == 0 ){ //如果队首元素满足需求
b[ q[front] ] = i; //出队时间为i
++front; //出队
--cnt; //队内人数-1
} else {
q[++rear] = q[front]; //队首元素站到队尾
++front; //队首出队(站到队尾)
}
}
for ( int i = 0 ;i < n; i++ )
printf("%d ", b[i] + 1); //i从0开始 需要+1
return 0;
}
例6
代码源-206
#include <bits/stdc++.h>
using namespace std;
int n,m;
int front = 1, rear = 0;
int q[100010];
int main()
{
scanf("%d %d", &n, &m );
for ( int i = 1; i <= n; i++ ){
q[++rear] = i;
}
int cnt = 1;
while ( n > 0) {
if (cnt == m) {
cnt = 1;
printf("%d ", q[front]);
++front;
--n;
} else {
cnt++;
q[++rear] = q[front];
++front;
}
}
return 0;
}
由上述例子,我们发现对于一些具有鲜明的先后顺序的问题,队列可以轻易地帮助我们解决他们。但与此同时,我们也发现了此类普通队列的一些不足之处:每次需要定义及其庞大的数组。且往往对于定义的数组无法充分利用,导致大量空间的浪费。
- 针对以上问题,我们提出了解决方案,对于“浪费”的空间,加以重复利用
由此,我们发现了“循环队列”。
同样的,我们通过例题方式加以理解。
#include <bits/stdc++.h>
using namespace std;
char a[1010];
int m;
const int size=1010;
int front = 1, rear = size;
int q[size + 1]; //队列长度一定要大于size(区分队列为空)
int main()
{
scanf("%d", &m);
for ( int i = 0; i < m; i++ ){
scanf("%s", a);
if ( a[2] == 's' ) {
int x;
scanf("%d", &x);
rear = rear % size + 1;
q[rear] = x;
}else
{
if( a[0] == 'p' ){
front = front % size + 1;
}else{
int x;
scanf("%d", &x);
if ( front + x - 1 <= size ){
printf("%d\n", q[front + x -1 ] );
}else{
printf("%d\n", q[ front + x - 1 - size]);
}
}
}
}
return 0;
}
标签:include,队列,scanf,++,int,front,第二节,数据结构,rear From: https://www.cnblogs.com/XTian258/p/17003205.html虽然在头文件
#include <queue>
中也有对应的stl函数,但仍然有不灵活的问题存在,因此该函数在平时使用中也很少被调用, 因此还是建议熟悉数组形式的编码方式.