首页 > 其他分享 >队列

队列

时间:2023-12-21 20:12:33浏览次数:28  
标签:head return vis 队列 int rear

机器翻译(洛谷P1540)


题目大意

有m个可存放单词和译意的单元,初始内容为空,依次读取文章单词,若在内存单元中不存在则从外存读入,载入内存,若内存数据超过m则最先录入内存单元的出队,直到文章全部翻译完,求外存查找次数。


解题思路

限定了队列容量为m,每当队列中找不到匹配单词时从外存载入,次数+1,超过队列容量时,依据队列FIFO原则。

STL queue
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
bool vis[N];	//记录是否在队列中,降低时间复杂度
int main(){
	int n,m;
	cin>>n>>m;
	queue<int>q;
	int ans=0;
	for(int i=1,k;i<=m;i++){
		cin>>k;
		if(!vis[k]){
			q.push(k);
			ans++;
			if(q.size()>n){	//超出容量出队
				vis[q.front()]=false;	//标记
				q.pop();
			}
		}
		vis[k]=true;
	}
	cout<<ans<<endl;
	return 0;
}
手写循环队列
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
bool vis[N];
struct myque{
    int v[N];
    /*动态分配 int*v; */
    int head,rear;
    bool init(){
        /*动态分配
        v=(int*)malloc(N*sizeof(int);
        if(!v)return false; */
        head=rear=0;
        return true;
    }
    int size(){
        return (rear-head+N)%N;
    }
    bool empty(){
        return size()==0;
    }
    bool push(int x){
        if((rear+1)%N==head)return false;   //队列满
        v[rear]=x;
        rear=(rear+1)%N;
        return true;
    }
    bool pop(int&x){
        if(head==rear)return false; //队列空
        x=v[head];
        head=(head+1)%N;
        return true;
    }
    int front(){
        return v[head];
    }
}Q;
int main(){
    Q.init();
    int n,m;
    cin>>n>>m;
    int ans=0;
    for(int i=1,k;i<=m;i++){
        cin>>k;
        if(!vis[k]){
            ans++;
            vis[k]=true;
            Q.push(k);
            if(Q.size()>n){
                int ret;
                Q.pop(ret);
                vis[ret]=false;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

滑动窗口/单调队列(洛谷P1886)


题目大意

有n个人,编号为1~n,初始队列为1号一个人,入队方式为指定插入编号i同学的左边或右边,删去m个同学,求剩余队列同学的编号


解题思路
对链表查找,添加,删除,遍历的操作。考虑遍历查找时间复杂度为O(n),使用数组存储编号对应链表节点位置的迭代器,实现O(1)级别查找。

未知的代码
#include<bits/stdc++.h>
using namespace std;
#define ITER list<int>::iterator
const int N=1e5+5;
ITER pos[N];	//记录编号对应的链表节点
list<int>l;
bool vis[N];	//记录是否删除
int main(){
	int n,m,k,p;
	cin>>n;
	l.push_back(1);
	pos[1]=l.begin();
	auto insert=[&](int k,int p,int v){
		if(p)pos[v]=l.insert(next(pos[k]),v);	//p==1,右插,迭代器+1
		else pos[v]=l.insert(pos[k],v);
	};
	for(int i=2;i<=n;i++){
		cin>>k>>p;
		insert(k,p,i);
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>k;
		if(!vis[k])l.erase(pos[k]);
		vis[k]=true;
	}
	for(auto&it:l)cout<<it<<" ";
	return 0;
}

标签:head,return,vis,队列,int,rear
From: https://www.cnblogs.com/eternal-world/p/17919932.html

相关文章

  • 消息队列(一)
    消息队列是做什么的?消息队列(MessageQueue,简称MQ)是一种在消息的传输过程中保存消息的容器。它是一种跨进程或线程间通信的方式,常用于不同进程或线程间异步处理数据。消息队列利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。消息队列一......
  • 队列
    1.队列概念及结构队列一种先进先出的数据结构,先入队列的数据先出队列单链表能实现队列?所以以原来的单链表无法用来实现队列,如何修改?只需再加个last引用指向尾,这样尾插入队操作复杂度就能达到O(1)但是需要注意:这种结构的单链表只能头插实现出队尾插实现入队,不......
  • 等待队列
    等待队列什么是等待队列等待队列是内核实现阻塞和唤醒的内核机制。等待队列以循环链表为基础结构,链表头和链表项分别为等待队列头和等待队列元素。整个等待队列由等待队列头进行管理。等待队列头使用结构体wait_queue_head_t来表示,等待队列头就是一个等待队列的头部,这个结构......
  • Netty使用CompletableFuture实现异步串行队列
    一、前言CompletableFuture是JDK1.8提供的一种更加强大的异步编程的api。它实现了Future接口,也就是Future的功能特性CompletableFuture也有。它也实现了CompletionStage接口,CompletionStage接口定义了任务编排的方法,执行某一阶段,可以向下执行后续阶段。CompletableFuture相比于Futu......
  • 数据结构 —— 线性表、栈、队列
    一、算法复杂度 【2011】设n是描述问题规模的非负整数,下面的程序片段时间复杂度是()x=2;while(x<n/2)x=2*x;AO(log2(n))  BO(n) CO(nlog2(n)) DO(n^2) 答案:A解析:x=2^i=n/2i=log2(n/2) 【2012】求整数n(n>=0)的阶乘的算法......
  • 消息队列
    首先使用消息队列前,我们需要知道,消息队列是用来发送、接收数据的一个容器,简单的说:我们在某宝上买东西,这中间有一个快递的过程,而大多数情况下,我本人选择将我买的东西寄到某个代收点,派送员只需要按照我的要求将东西放到代收点就可以了,之后我有时间了才自己去取。消息队列就类似于这......
  • 一文讲透消息队列RocketMQ实现消费幂等
    这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:消费幂等。1基础概念消费幂等是指:当出现RocketMQ消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统产生任何负面影响。例如,在支付场景下,消费者消费扣款消息,对一笔订单......
  • 消息队列和事件循环
    每个渲染进程都有一个主线程,并且主线程非常繁忙,既要处理DOM,又要计算样式,还要处理布局,同时还需要处理JavaScript任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务,这个统筹调度系统就是消息队列和事件循环系统。但并不......
  • 【合并排序链表】分治/优先队列
    合并两个排序链表模拟维护一个合并链表,每次添加两个排序链表中较小val的节点即可模拟代码publicListNodemergeTwo(ListNodea,ListNodeb){if(a==null)returnb;if(b==null)returna;ListNodeans=newListNode(0);Lis......
  • 记录rabbitMQ的广播队列的错误使用导致未能正确广播的问题
    背景说明:有3个服务S1、S2、S3现在服务S1需要发布消息到广播交换机E,并建立了两个普通队列Q1,Q2,将其绑定到广播交换机E上服务S2和服务S3同时监听队列Q1,Q2本意是,服务S1通过广播交换机E把消息同时推送给服务S2和S3后面测试时,同事发现,服务S2和服务S3都只接收到了部分消息,而不是全......