队列(入门)

引入:

队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表,简称 FIFO 表。

就像排队取餐一样,先来排队的会先拿到餐,并先离开,而后来排队的后那到餐,并后离开。

队列的实现:

数组模拟队列:

一般用两个边量,一个表示对头(pl),一个表示队尾(pr)

int q[N],pl=1,pr;
q[++pr]=a;//入队
pl++;//弹出队头
q[ql];//访问队头
q[qr];//访问队尾 
pl=1;pr=0;//清空队列
if(pr>0) //判断是否为空
 

双栈模拟队列:

这个方法比较少用,因为不是很好。。。那也满写一下。

首先我们需要两个栈,一个为栈a(队头的栈),栈b(队尾的栈)。它支持push操作,即在栈b入栈,pop操作,即在栈a中出栈。

  • push:插入到栈b中
  • pop:如果 a 非空,让 a 弹栈;否则,把 b 的元素一个一个弹出插入,做完后是首尾颠倒的。

,然后再让 S 弹栈。

(好麻烦啊~~~)

C++STL实现栈:

c++党已经高兴的不行了吧!

首先头文件别忘了#include<queue>(除非你用万能头~~~)

STL 中的 queue 较为常用的函数有:

  • q.front() 返回队首元素
  • q.back() 返回队尾元素
  • q.push() 在队尾插入元素
  • q.pop() 弹出队首元素
  • q.empty() 队列是否为空
  • q.size() 返回队列中元素的数量

此外,queue 还提供了一些运算符。较为常用的是使用赋值运算符 = 为 queue 赋值,示例:

#include<bits/stdc++.h>

using namespace std;

int main(){
	queue<int> q;//也可以定义为结构体
	int n;cin>>n;
	for(int i=1;i<=n;i++){//输入n个元素,并插入队列
		int x;cin>>x;
		q.push(x);
	}
	for(int i=1;i<=n;i++){//先进先出
		int y=q.front();
		q.pop();
		cout<<y<<" "; 
	} 
	if(q.empty()) cout<<"empty!\n";//判断是否为空,返回true,则为空,否则相反
	q.push(1);q.push(2);
	int y=q.back();//查询队尾元素,并输出
	cout<<y<<endl;
	return 0;
} 

特殊的队列:

C++STL中的双端队列:

depue就是stl中的双端队列,它类似于vector与queue的合体!

首先是头文件:#include<deque>

STL 中的 deque较为常用的函数有:

  • q.front() 返回队首元素
  • q.back() 返回队尾元素
  • q.push_back() 在队尾插入元素
  • q.pop_back() 弹出队尾元素
  • q.push_front() 在队首插入元素
  • q.pop_front() 弹出队首元素
  • q.insert() 在指定位置前插入元素(传入迭代器和元素)
  • q.erase() 删除指定位置的元素(传入迭代器)
  • q.empty() 队列是否为空
  • q.size() 返回队列中元素的数量

此外,deque 还提供了一些运算符。其中较为常用的有:

  • 使用赋值运算符 = 为 deque 赋值,类似 queue
  • 使用 [] 访问元素,类似 vector

<queue> 头文件中还提供了优先队列 priority_queue,因其与堆相似,若想学习请转到堆的文章。

示例:

#include<bits/stdc++.h>

using namespace std;
//这里主要是大家自己动手写写!
int main(){
	deque<int> q;
	int n;cin>>n;
	for(int i=1;i<=n;i++){//若从前面入队列,类似一个栈
		int x;cin>>x;
		q.push_front(x);
	}
	int m;cin>>m;
	for(int i=1;i<=m;i++){//若从后面入队列,类似队列QAQ
		int x;cin>>x;
		q.push_back(x);
	}
	if(q.empty()) cout<<"empty!\n";
	else{
		cout<<"fill!\n"<<q.size()<<"\n";
	} 
	int len=q.size();
	for(int i=1;i<=len;i++){
		int y=q.front();
		q.pop_front();
		cout<<y<<" ";
	}
	cout<<endl;
	q.push_front(1);q.push_front(2);
	int y=q.back();
	q.pop_back();
	cout<<y;
	return 0;
} 

循环队列:

其实C++STL中的queue就是一个循环队列。

若用数组模拟循环队列:随着时间的推移,整个队列会向数组的尾部移动,一旦到达数组的最末端,即使数组的前端还有空闲位置,再进行入队操作也会导致溢出。

解决溢出的办法是采用循环的方式来组织存放队列元素的数组,即将数组下标为 x 的元素,它的后继为 (x + 1) % SIZE,这样就形成了循环队列。

总结:

队列的基本实现与用法就讲到这了,若想灵活使用队列一定要多刷题哦!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值