在STL里就有栈(头文件:stack)和队列(头文件:queue)的容器,但是我们通常手写来实现。因为STL里的栈和队列不能进行遍历,并且运行速度较慢。
一、栈
栈的概念:
栈(stack)是一个后进先出或先进后出的一个特殊线性表(它只能在栈顶进行入栈或出栈)。
如图所示:
栈的基本操作:
定义:int Stack[maxn],top=0;//top表示当前栈顶元素
入栈:inline void push(int x) {Stack[++top]=x;}
出栈:inline int pop() {return Stack[top--];}
判断栈是否为空:inline bool empty() {return top==0 ? 1:0}//表示栈顶若是没有元素,那么就返回真,否则就返回假
这里有一个需要注意的问题,如果你用了万能头文件(bits/stdc++.h)或者已经调用内置的stack(队列也一样)的话,再在手写的栈中用stack数组,那么它就会出现问题(就是会炸),,所以我们定义变量的时候需要把s改成S或者加点什么(这个随你)。
那么我们接下来再来分析一个很高大上(恶心)的东西,它就是——单调栈。
什么是单调栈?
单调栈其实和一般的栈差不多,唯一不同的一点就是它是递增或者递减的。
for example:
现有如下两个栈:
stack1:1 2 3 2 5
stack2:1 2 3 4 5
由概念得:第一个就是普通的栈,第二个就是传说中的单调栈。
二、队列
队列的概念:
队列(queue)是一个先进先出或后进后出的特殊线性表。(和栈相反)
如图所示:
队列的基本操作:
定义:int Queue[maxn],head=0,tail=0;//head指向队首元素,tail指向队尾元素(有些地方会把队首写成front,队尾写成rear 反正都一样) (注意初始化)
入队:inline void push(int x) {Queue[++tail]=x;}//x表示入队元素
出队:inline int pop() {return Queue[head++];}
判断栈是否为空:inline bool empty() {return head>tail ? 1:0;}
队列中元素的个数:tail-head+1
这样的队列有一个缺陷——溢出
如:0 0 0 1 2 3 4 5 6 ······ maxn
如果maxn后还有元素,那么就会上溢出。
如果要处理这种情况,那么就要用到循环队列。
循环队列:把链状队列变成了环状队列。
环状队列的基本操作:
入队: inline void push(int x){Queue[head]=x;tail=(tail+1)%n;}
出队:inline int pop(){int t=Queue[head];head=(head+1)%n;return t;}
判断队满或队空:inline bool empty(){return head==(tail+1)%n ?1:0}
当然,还有最神奇的单调队列
什么是单调队列?
单调队列是双端队列的一种,可以在对头和队尾同时进行入队和出队,当然它也是有单调性的。由于它能同时进行入队和出队,于是大大地提高了它的运行速度。
单调队列的基本操作和基础的队列(循环队列)相似,有一点点的改动,我就不再列举了~