数据结构-队列

了解什么是数据结构

数据结构的定义

简介

队列是数据结构之一。跟数组一样是线性表(1维),但是分头尾指针(不用说很好理解,指向队列头尾元素),分进队和出队,顺序是先进先出。

操作

图片表示

图片解析: Alt

具体实现

用标准队列实现

  1. 需要调用 #include<queue> 的头文件
  2. 定义方式: queue<变量类型> q;
  3. 插入元素: q.push(插入元素);
  4. 弹出队首元素:q.pop();
  5. 判断队列是否为空:(!)q.empty();//根据需求使用
  6. 队首元素:q.front();

用数组实现

  1. 定义方式:const int maxn=1e3+10; int head,tail; int q[maxn]; //head表示队首指针,tail表示队尾指针,开始head=tail
  2. 插入元素: q[tail++]=插入元素;
  3. 弹出队首元素: head++;
  4. 判断队列是否为空:bool empty(){ return head==tail; }
  5. 队首元素:q[head];

经典题目(由于数据结构只是用于辅助程序咱不做题目分类(当然做不了))

好数集

题目链接

好数集

题目思路

模拟

  1. 将初始元素放入队列(如果队首元素<=N)
  2. 从队首依次循环判断
    1. 答案数++;
    2. 判断2(3)*队首元素+1是否<=N且没有出现过
      1. 是: 添加并标记
      2. 否:不做任何操作
  3. 输出答案数

代码实现

#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数集

题目链接

Blah数集

题目思路

模拟

  1. 循环执行多组数据
    1. 将初始元素放入队列
    2. 定义x1,x2指针(用来指向2*()+1和3*()+1对应元素所在位置的下标。
    3. 从1到n-1循环
      1. 对比2x1+1和3x2+1;
        1. 2x1+1<3x2+1
          1. 队列加入新元素2*x1+1;
          2. 指针x1++;
        2. 3x2+1<2x1+1
          1. 队列加入新元素3*x2+1;
          2. 指针x2++;
        3. 2x1+1==3x2+1
          1. 队列加入新元素2x1+1或3x2+1(反正都一样);
          2. 指针x1++,x2++;
    4. 输出第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;
}

希望大家多多评论,感谢大家做我的粉丝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

materialistOier

我只是一名ssfoier

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值