数据结构之栈、队列(入门)

在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或者加点什么(这个随你)

那么我们接下来再来分析一个很高大上(恶心)的东西,它就是——单调栈。

什么是单调栈?

单调栈其实和一般的栈差不多,唯一不同的一点就是它是递增或者递减的。

扫描二维码关注公众号,回复: 2167650 查看本文章

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}


当然,还有最神奇的单调队列

什么是单调队列?

单调队列是双端队列的一种,可以在对头和队尾同时进行入队和出队,当然它也是有单调性的。由于它能同时进行入队和出队,于是大大地提高了它的运行速度。

单调队列的基本操作和基础的队列(循环队列)相似,有一点点的改动,我就不再列举了~

猜你喜欢

转载自blog.csdn.net/chenkainan1023/article/details/79062347