[YM]模板-队列

概念:

“先进先出”,只能向队尾插入数据,从队头删除数据

分为链队列循环队列

一般用STL queue或者手写静态数组实现队列

这里以链队列(普通队列)讲解

在STL库中可以 #include<queue> 进行调用

函数:

push()         在队尾插入一个元素

pop()           删除队列第一个元素

size()           返回队列中元素个数

empty()       如果队列空则返回true

front()         返回队列中的第一个元素

back()         返回队列中最后一个元素

clear()                      清空队列

图示:

模板:

struct Queue{
    int head=0,end=0;
    int data[N]={0};
    bool empty(){
        return head==end;
    }
    int size(){
        return end-head;
    }
    void pop(){
        head++;
    }
    int front(){
        return data[head];
    }
    int back(){
        return data[end-1];
    }
    void push(int e){
        data[end++]=e;
    }
    void clear(){
        head=end=1;
    }
};

模板题:

题1:

洛谷:B3616 【模板】队列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

/*---code---*/
const int N = 1e5 + 10;
struct Queue{
    int head=0,end=0;
    int data[N]={0};
    bool empty(){
        return head==end;
    }
    int size(){
        return end-head;
    }
    void pop(){
        head++;
    }
    int front(){
        return data[head];
    }
    int back(){
        return data[end-1];
    }
    void push(int e){
        data[end++]=e;
    }
    void clear(){
        head=end=1;
    }
};
Queue q;
void solve(){
	int n;cin>>n;
    while(n--){
        int op,x;
        cin>>op;
        if(op==1){
            cin>>x;
            q.push(x);
        }else if(op==2){
            if(q.empty())cout<<"ERR_CANNOT_POP\n";
            else q.pop();
        }else if(op==3){
            if(q.empty())cout<<"ERR_CANNOT_QUERY\n";
            else cout<<q.front()<<"\n";
        }else{
            cout<<q.size()<<"\n";
        }
    };
}

题2:

洛谷:P1540 [NOIP2010 提高组] 机器翻译 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

/*---code---*/
const int N = 1e5 + 10;
struct Queue{
    int head=0,end=0;
    int data[N]={0};
    bool empty(){
        return head==end;
    }
    int size(){
        return end-head;
    }
    void pop(){
        head++;
    }
    int front(){
        return data[head];
    }
    int back(){
        return data[end-1];
    }
    void push(int e){
        data[end++]=e;
    }
    void clear(){
        head=end=1;
    }
};
int m,n,cnt;
Queue q;
int Hash[N];  //哈希表,查询是否已经在队列里存在了
void solve(){
	cin>>m>>n;
	while (n--) {
		int x;cin >> x;
		if (!Hash[x]) {       //判断是否已经存在  
			cnt++;            //不存在就加1   
			q.push(x);        //加入队列
			Hash[x] = 1;      //标记已经查阅过
			if (q.size()>m){  //如果内存已满就删去队头           
				Hash[q.front()] = 0;     
				q.pop();                       
			}
		}
	}
	cout<<cnt;
}

结尾:

其他数据结构以及算法模板关注专栏

[YM]算法模板_夜喵YM的博客-CSDN博客

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值