队列--专题讲解

模拟队列

先进先出
队列大概模样
在这里插入图片描述
代码截屏:

#include<bits/stdc++.h>
using namespace std;

// 用数组模拟栈
const int N=100;
int que[N],k=0;  // que代表的是队列数组,k就是队尾指针
//入队:队尾指针先+1,然后入队
que[++k]=66;

//出队:队顶指针先-1,然后出队
for(int i =0;i<k;i++){
    que[i]=que[i+1];
}
k--;

// 判断队列是否为空
if(k==0) true
else false

//队首
que[0];

//队尾
que[k];

queue

头文件
#include <queue>
定义
//队列 
  queue<int> q;
基本操作
  //向队尾插入一个元素
  q.push();
  
  //返回队头元素
  q.front();
  
  //返回队尾元素
  q.back();
  
  //弹出对头元素
  q.pop();
  
  //元素个数
  q.size();
  
  //清空队列
  q = queue<int>();

循环队列queue

	//push/pop
	//push入队尾,pop入队头 
	for(int i=0;i<10;i++) q.push(i);
	q.pop();
	
	//front/back
	int x=q.front();
	int y=q.back();
	cout<<"front= "<<x<<endl<<"back= "<<y<<endl;

优先队列priority_queue

用法详解点这里

  • top 访问队头元素
  • empty 队列是否为空
  • size 返回队列内元素个数
  • push 插入元素到队尾 (并排序)
  • emplace原地构造一个元素并插入队列
  • pop 弹出队头元素
  • swap 交换内容

定义

//升序序列
	priority_queue<int,vector<int>,greater<int> > qg;
	//降序序列
	priority_queue<int,vector<int>,less<int> > ql;
	

银行大厅排队

描述:

在银行营业大厅共服务3种客户,类型为A\B\C,大厅分别设置了3个窗口分别服务三种客户,即每个窗口只服务一种客户。现有一批客户来银行办理业务,每个客户都有类型和办理业务时间。每个窗口按照客户到来的顺序进行服务。

输入

第一行输入先输入n表示客户数量
第二行输入每个客户的类型,数据之间用用空格隔开
第三行输入每个客户的办理时间,数据之间用用空格隔开

/示例/
8
A B C B C A A A
10 20 30 40 50 60 70 80
1
2
3
4
输出:

第一行输出A类客户的平均办理时间 :
第二行输出B类客户的平均办理时间 :20+40=60/2=30
第三行输出C类客户的平均办理时间

/示例/
55
30
40
解题思路:

为了算出各类客户的平均办理时间,首先要知道的是各类客户花费的总时间。

3种窗口服务三种客户,也就是算出每个窗口的时间。通过将每个窗口抽象成一个队列,将时间作为内容填入队列,即可算出总时间。

除了每个窗口的队列以外,我们还需要将输入的顺序进行存储,因此总共需要4条队列。

#include<iostream>
#include<queue>
using namespace std;

int main() {
	int t;  //次数
	int m;  //待输入的时间
	char ch;  //待输入的客户类型
	queue<int> myQe, myQa[3];  // Qe代表次序,Qa代表窗口
	cin >> t;
    
    // 输入部分
	while (t--) {
		cin >> ch;
		myQe.push(ch-65);  //注意此处push进去的是一个数字,为了查找方便,当ch=A时,把0给push进去,以此类推。A字符转化为数字为65
	}
    
    //输入部分
	while (!myQe.empty()) {
		cin >> m;
		int num = myQe.front();  //根据顺序获取窗口
		myQe.pop();
		myQa[num].push(m);
	}
    
    //输出部分
	for (int i = 0; i < 3; i++) {
		int n = myQa[i].size();  //计算平均数时需要的分母
		int sum = 0;
		while (!myQa[i].empty()) {
			sum += myQa[i].front();
			myQa[i].pop();
		}
		cout << sum / n << endl;
	}
}

训练挑战

#include<iostream>
#include<queue>
using namespace std;

int main() {
	int t;  //次数
	int m;  //待输入的时间
	char ch;  //待输入的客户类型
	queue<int> myQe, myQa[3];  // Qe代表次序,Qa代表窗口
	cin >> t;
    
    // 输入部分
	while (t--) {
		cin >> ch;
		; //注意此处push进去的是一个数字,为了查找方便,当ch=A时,把0给push进去,以此类推。A字符转化为数字为65
	}
    
    //输入部分
	while (!myQe.empty()) {
		cin >> m;
		int num = myQe.front();  //根据顺序获取窗口
		;//myQe弹出
		;//myQa[num]入队列m
	}
    
    //输出部分
	for (int i = 0; i < 3; i++) {
		int n = myQa[i].size();  //计算平均数时需要的分母
		;//定义num,并初始化
		while () {//判断myQa[i]是否为空
			;//sum加上当前myQa[i]的值
			;//myQa[i]弹出
		}
		;//输出 sum 除以 n 答案 
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值