test2
栈是一种在竞赛中非常实用的基础数据结构。本篇笔记主要记录了栈的一些例题与技巧。 基本性质 对于一个栈,保证有以下性质 先入栈的元素一定后出 后入栈则反之 例如对于$3,6,0,1,2$这一组数据来说,假设我们将他们全部入栈,再全部出栈,那么出栈后的序列为$2,1,0,6,3.$ 【例题】$push,pop,Getmin$ 实现一个栈,支持入栈,出栈和查询最小值的工作,要求时间复杂度均为$O(1).$ $ $对于入栈、出栈的功能,$c++ STL stack$中自带的函数时间复杂度为$O(1)$。但是对于查询最小值而言,栈本身的性质并不支持这种操作。 $ $我们可以考虑在维护一个$stack$的同时,再维护一个二叉堆(即优先队列),这样就可以达到题目的要求。然而,这样的时间复杂度为$O(logN).$ $ $所以我们需要一种更高效的算法。我们发现,每一次入栈、出栈的时间复杂度均为$O(1)$;而我们又知道,假设有两个数$x,y$,当我们每对这两个数做出一次比较是,时间复杂度也是$O(1).$我们利用这样的性质,同时维护两个栈结构$P_1,P_2$,其中$P_1$存放的是原本的数据,而$P_2$存放的是从$P_1$栈底$P_{1_{0/1}}$至当前栈顶$P_{1_n}$的最大值。 $ $这样,我们就可以梳理出一个程序的脉络$.$ 若此次执行的是$push$操作,则将此元素$x$压进