数据结构-队列
了解什么是数据结构
简介
队列是数据结构之一。跟数组一样是线性表(1维),但是分头尾指针(不用说很好理解,指向队列头尾元素),分进队和出队,顺序是先进先出。
操作
图片表示
图片解析:
具体实现
用标准队列实现
- 需要调用
#include<queue>
的头文件 - 定义方式:
queue<变量类型> q;
- 插入元素:
q.push(插入元素);
- 弹出队首元素:
q.pop();
- 判断队列是否为空:
(!)q.empty();//根据需求使用
- 队首元素:
q.front();
用数组实现
- 定义方式:
const int maxn=1e3+10; int head,tail; int q[maxn]; //head表示队首指针,tail表示队尾指针,开始head=tail
- 插入元素:
q[tail++]=插入元素;
- 弹出队首元素:
head++;
- 判断队列是否为空:
bool empty(){ return head==tail; }
- 队首元素:
q[head];
经典题目(由于数据结构只是用于辅助程序咱不做题目分类(当然做不了))
好数集
题目链接
题目思路
模拟
- 将初始元素放入队列(如果队首元素<=N)
- 从队首依次循环判断
- 答案数++;
- 判断2(3)*队首元素+1是否<=N且没有出现过
- 是: 添加并标记
- 否:不做任何操作
- 输出答案数
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a,n,head,tail,ans;
int que[maxn];
bool visit[maxn];
int main(){
cin>>a>>n;
//初始化
if(a<=n){
que[tail++]=a;
visit[a]=true;
}
//进行添加计数操作
while(head<tail){
int x=que[head++];
ans++;
for(int i=2;i<=3;i++){
if(i*x+1<=n&&!visit[i*x+1]){
que[tail++]=i*x+1;
visit[i*x+1]=true;
}
}
}
cout<<ans<<endl;
return 0;
}
Blah数集
题目链接
题目思路
模拟
- 循环执行多组数据
- 将初始元素放入队列
- 定义x1,x2指针(用来指向2*()+1和3*()+1对应元素所在位置的下标。
- 从1到n-1循环
- 对比2x1+1和3x2+1;
- 2x1+1<3x2+1
- 队列加入新元素2*x1+1;
- 指针x1++;
- 3x2+1<2x1+1
- 队列加入新元素3*x2+1;
- 指针x2++;
- 2x1+1==3x2+1
- 队列加入新元素2x1+1或3x2+1(反正都一样);
- 指针x1++,x2++;
- 2x1+1<3x2+1
- 对比2x1+1和3x2+1;
- 输出第n个元素。
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a,n,tail,ans,x1,x2;
int que[maxn];
int main(){
while(scanf("%d%d",&a,&n)!=EOF){
tail=0;
que[tail++]=a;
x1=x2=0;
for(int i=1;i<=n-1;i++){
int s1=que[x1]*2+1,s2=que[x2]*3+1;
if(s1==s2){
que[tail++]=s1;
x1++,x2++;
}
else if(s1<s2){
que[tail++]=s1;
x1++;
}
else {
que[tail++]=s2;
x2++;
}
}
printf("%d\n",que[n-1]);
}
return 0;
}
希望大家多多评论,感谢大家做我的粉丝。