定义
队列是一种特殊的线性表,具有先进先出和后进先出的性质。只允许一端进行插入操作,另一端进行删除操作的线性数据结构
- 队头
- 队尾
性质
先进先出,First In First Out, FIFO
操作
,永远指向队列的开头的第一个元素的位置 ,永远指向队列的结尾的最后一个元素的后面一个位置
也就是
创建队列
const int maxn = 1e5+5; //队列的最大容量
int que[maxn]; //队列的存储空间
int head= 0, tail = 0; //队头和队尾
基本操作
- 插入元素
void push (int n){
que[tail++] = n; //为什么是tail++,不是++tail?
}
- 删除元素
void pop() {
head++;
}
- 获得队列中第一个元素
int front() {
return que[head];
}
- 获得队列中最后一个元素
int back() {
return que[tail-1];
}
- 判断队列是否为空
bool empty() {
return head == tail;
}
- 获得队列中元素的个数
int size() {
return tail-head;
}
模板
template<typename T = int,int siz = maxn>
struct myqueue{
T a[siz+5];
//tail 指向最后一个元素后面一个位置
//head 指向第一个元素
int head = 0,tail=0;
void clear() { head =tail = 0;}
void push(T b) { a[tail++] = b;}
void pop(){head++;}
void pop_back(){tail--;}
T front() { return a[head];}
T back() { return a[tail-1];}
bool empty() { return head == tail;}
int size() { return tail-head;}
};
练习
- [
luogu P1540: [NOIP 2010 提高组] 机器翻译] - [
luogu P1090: [NOIP 2004 提高组] 合并果子] 数学归纳法,数学直觉 - [
noi_openjudge ch0304-2406: Card Stacking] 环形队列,模拟,USACO December 2007 Bronze - [
noi_openjudge ch0304-2729: Blah数集] 神奇证明,数学直觉,暴力验证 - [
leetcodecn implement-stack-using-queues: 用队列实现栈] -
- 移掉 K 位数字(https://leetcode.cn/problems/remove-k-digits/description/) TODO 单调栈