栈与队列的特点
1、栈:FIFO
栈是仅能对其一端进行操作的结构,实现后进先出的效果。在C++中采用容器适配器的方式实现栈。(容器适配器实际上就是对某一类型的对象进行泛化,定义了这一类泛化对象的可进行操作的逻辑)
什么是适配器,C++ STL容器适配器详解
stack的容器有三种有 vector、deque 和 list,默认使用的是deque容器。
2、队列:LIFO
队列是能对两端进行操作的结构,实现先进先出的效果。和 stack 栈容器适配器不同,queue 容器适配器有 2 个开口,其中一个开口专门用来输入数据,另一个专门用来输出数据,如图 1 所示。
这种存储结构最大的特点是,最先进入 queue 的元素,也可以最先从 queue 中出来,即用此容器适配器存储数据具有“先进先出(简称 “FIFO” )”的特点,因此 queue 又称为队列适配器。
C++ STL queue容器适配器详解
queue的容器有三种有 vector、deque 和 list,默认使用的是deque容器。
参考文章:栈与队列基础
栈相关题型
栈适用于对相邻元素进行某种判定和操作
题目:
-
对顶栈模拟队列
81、【栈与队列】leetcode ——232. 用栈实现队列(C++版本) -
进栈匹配结果,可简化代码
83、【栈与队列】leetcode ——20. 有效的括号(C++版本)
-
用栈适于对相邻元素进行操作的特点,对相邻元素进行判定,不重复元素入栈,重复元素弹出
84、【栈与队列】leetcode ——1047. 删除字符串中的所有相邻重复项:栈+双指针解法(C++版本) -
后缀表达式进入栈的过程,相当于对中缀形式的树进行后序遍历
85、【栈与队列】leetcode ——150. 逆波兰表达式求值(C++版本)
队列相关题型
(1)单调队列:维护一个单调不增或单调不减的队列
(2)优先队列:按照大根堆或小根堆的排列方式,维护一个单调不减或单调不增的队列。(注意创建方式和排序对比函数)
-
队列循环进出模拟栈
82、【栈与队列】leetcode ——225. 用队列实现栈(C++版本) -
使用单调队列保证队首元素为最大值,每次移动滑动窗口也把移除元素从队列中弹出。
√ 86、【栈与队列】leetcode ——39. 滑动窗口最大值:单调队列+滑动窗口(C++版本) -
构建一个优先队列,用小根堆来维护里面k个元素,当有更大元素加入时,将最小元素弹出。
√ 87、【栈与队列】leetcode ——347. 前 K 个高频元素:优先队列(小根堆)+Hash表(C++版本)