适用双栈的情形,
1、有输入和输出的问题。一个作为输入栈,一个作为输出栈。
2、保留特殊值(最大值,最小值)的问题。一个作为保存所有数据的数据栈,一个作为保留特殊值的辅助栈。
class CQueue {
/*
* 题目:
* 用两个栈实现一个队列。队列的声明如下
* 请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。
* (若队列中没有元素,deleteHead 操作返回 -1 )
*
*
* 思路:
* 直接插入的数据放入inputStack栈里,满足 appendTail
* outputStack栈里放要删除的数据。
* 当outputStack为null时,将整个inputStack转移到outputStack里。
* 数据从 inputStack --> outputStack 过程中,会把先进入inputStack的数据放到outputStack的栈顶。满足 deleteHead
*
*
* */
Stack<Integer> stackInput = null;
Stack<Integer> stackOutput = null;
public CQueue() {
stackInput = new Stack<>();
stackOutput = new Stack<>();
}
public void appendTail(int value) {
stackInput.push(value);
}
public int deleteHead() {
if (!stackOutput.isEmpty()) {
return stackOutput.pop();
}
if (stackInput.isEmpty()) {
return -1;
}
while (!stackInput.isEmpty()) {
stackOutput.push(stackInput.pop());
}
return stackOutput.pop();
}
}
class MinStack {
/*
* 题目:
* 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)
*
* 思路:
* 要求时间复杂都为O(1) , 即可以直接完成
* 使用Stack , push 和 pop 可以直接完成
* min 函数 , 要求可以获取到当前的最小值
* 使用一个数据栈保存所有数据,满足 push pop
* 使用一个辅助堆栈,记录当前数据中的最小值。
* 新的数据一定比已有数据先移除,注意开始时辅助堆栈为空的情况。
* 新的数据小于当前最小值时,更新辅助堆栈,当该数据被移除时,辅助堆栈也要移除 ;
* 新的数据大于当前最小值时,总数据的最小值不变,辅助堆栈无改变。
*
* */
Stack<Integer> dateStack = null; // 数据栈
Stack<Integer> minStack = null; // 辅助栈,存放当前最小值
public MinStack() {
dateStack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
dateStack.add(x);
if (minStack.isEmpty() || minStack.peek() >= x) {
minStack.add(x);
}
}
public void pop() {
int t = dateStack.pop();
if (t == minStack.peek()) {
minStack.pop();
}
}
public int top() {
return dateStack.peek();
}
public int min() {
return minStack.peek();
}
}