Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
Example:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.
乍看没有想清楚可以用什么来实现,本来想用一维数组,但一维数组的增添移位问题很麻烦。所以这种问题都应该使用有向链表。
总结关于list的一些关系结构与常用方法:
首先我们可以看到在最上面是Collettion然后是List、Queue、set、在List下面又有ArrayList、Linkedlist,Queue下面有Linkedlist,Set下面又有HashSet。
1.add()方法用来向创建的arraylist中添加元素,添加元素会自动添加到列表的末尾。add()方法有两个重载,步骤3是add()的第一个方法,传入一个参数,接下来我们使用add()的另外一个方法,传入两个参数,第一个传入参数为想要添加到列表的位置,注意这里位置是从0开始而不是从1,第二个传入参数为添加的元素。
addAll( )将一个集合插入到指定集合的指定位置。
2.使用remove()方法删除元素,如果传入的参数为元素本身,则通过元素本身的引用来删除元素;如果传入的参数为列表的索引,则通过列表的索引值来删除元素。
3.set()方法设置列表中索引对应的元素,传入两个参数,第一个参数为列表的索引值,第二个参数为要设置的元素值,如下图:
4.contains()方法判断列表中是否包含指定元素,传入参数为需要判断的元素
5.size()方法用于获取arraylist列表的大小
6.isEmpty()判断集合是否为空
7.indexOf()返回集合中第一次出现这个元素的位置如果不存在则返回-1
8.get()返回集合中指定位置的元素
9.containsAll()判断集合中是否包含另一个集合的全部
10.clear()清除所有元素
java版本代码如下:
//用有序链表来实现
public class MinStack {
/** initialize your data structure here. */
LinkedList<Integer> linkedList=new LinkedList<>();
int min=Integer.MAX_VALUE;//注意写法MAX_VALUE纯大写,直接赋值首个值在push中用起来比较复杂,不如用Integer.MAX_VALUE直接初始化方便些
public MinStack() {
} //MinStack minStack = new MinStack();//主函数没有内容??
public void push(int x) {
linkedList.add(x);//以add()方法push元素
if(x<min)//增加元素的时候,挨个比较就可以保持min了
min=x;
}
public void pop() {//弹出元素的时候,min有可能不变有可能改变,下面分为两种情况处理
if(min<linkedList.getLast()) //getLast()用于获取最后一个链表元素的值
linkedList.removeLast();//removeLast()用于删除最后一个值
else{
linkedList.removeLast();
min=Integer.MAX_VALUE;//如果最后一个值就是最小值,那么需要重新遍历一遍得到新的min
for(int i=0;i<linkedList.size();i++){
if(linkedList.get(i)<min)
min=linkedList.get(i);
}
}
}
public int top() {
return linkedList.getLast();//队列Queue先进先出,栈Stack先进后出;所以用getLast()获取TOP值
}
public int getMin() {
return min;
}
}