1. 栈的概念介绍和Java API
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
2. 设计实现一个有getMin功能的栈 :
普通的栈包含pop()、push()方法,实现一个栈,可以在常数时间内实现返回栈内最小值。
实现该数据结构,只要使用2个栈即可,一个栈正常保存数据,一个栈保存最小值。下图表述了我的思路:

下面是对思路的java代码实现 :
class MinStack {
private Stack<Integer> stackData ;
private Stack<Integer> stackMin ;
/** initialize your data structure here. */
public MinStack() {
stackData = new Stack<>() ;
stackMin = new Stack<>() ;
}
public void push(int x) {
stackData.push(x) ;
if(stackMin.isEmpty() || x <=stackMin.peek()){
stackMin.push(x) ;
}
}
public void pop() {
if(stackData.isEmpty()) return;
int dataTop = stackData.pop() ;
if(dataTop <= stackMin.peek()) {
stackMin.pop();
}
}
public int top() {
return stackData.peek();
}
public int min() {
return stackMin.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
3. 如何使用双栈实现队列 :
可以使用2个栈,一个栈负责队列入队数据(StackPush),一个栈负责队列出队数据(StackPop)。这个流程是这样的,先以1,2,3,4,5的顺序压入StackPush,那么StackPush里的元素从栈底到栈顶依次是:1,2,3,4,5; 这时再把所有元素从StackPush压入到StackPop,那么StackPop的元素从栈底到栈顶依次是:5,4,3,2,1。StackPop最终做pop的顺序就是1,2,3,4,5,与入队的顺序一致,实现了先入先出队列 。
但是从StackPush往StackPop同步时候,需要注意,请看下图的分析 :

下面给出Java的实现代码逻辑 :
class MyQueue {
private Stack<Integer> stackPush ;
private Stack<Integer> stackPop ;
public MyQueue() {
stackPush = new Stack<>() ;
stackPop = new Stack<>() ;
}
// 如果stackPop为空,将stackPush的所有元素压入stackPop
private void pushToPop(){
if(stackPop.isEmpty()){
while (!stackPush.isEmpty()){
stackPop.push(stackPush.pop()) ;
}
}
}
public void push(int x) {
pushToPop();
stackPush.push(x);
}
public int pop() {
pushToPop();
return stackPop.pop() ;
}
public int peek() {
pushToPop();
return stackPop.peek() ;
}
public boolean empty() {
return stackPop.isEmpty() && stackPush.isEmpty() ;
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/
网友评论