时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
思路:
第一眼看到这个题目,真是一脸懵逼,无从下手
题目的目的很明确要实现输出栈中的最小元素的函数,使用栈的数据结构,所以需要定义stack类型的变量,需要实现push函数,pop函数,top函数等
设立两个StackDate和StackMin,一个就是普通的栈,另外一个存储push进来的最小值。(stackMin的作用相当于是用于检索stackData中最小元素位置,)
push压栈:
每次压入的数据newNum都push进StackDate中,然后判断StackMin是否为空,如果为空那也把newNum同步压入StackMin里;如果不为空,就先比newNum和StackMin中栈顶元素的大小,如果newNum较大,那就不压入StackMin里,否则就同步压入StackMin里。
每次压入的数据newNum都push进StackDate中,然后判断StackMin是否为空,如果为空那也把newNum同步压入StackMin里;如果不为空,就先比newNum和StackMin中栈顶元素的大小,如果newNum较大,那就不压入StackMin里,否则就同步压入StackMin里。
![](https://img2020.cnblogs.com/i-beta/1059417/202003/1059417-20200320220720779-1013856519.png)
Pop出栈:
和push操作相对应,判断stackData栈顶元素是否与stackMin栈顶元素相同(stackMin中元素 <= stackData元素),如果相等,两个栈都弹出栈顶元素,不过不相等就stackData弹出
代码如下:
class Solution { public: stack<int> stack,stack_min; void push(int value) { stack.push(value); if(stack_min.empty()) stack_min.push(value); else if(value < stack_min.top()) stack_min.push(value); } void pop() { if(stack.top() == stack_min.top()) stack_min.pop(); stack.pop(); } int top() { return stack.top(); } int min() { return stack_min.top(); } };
附上堆栈stack的基本操作: