先来说一个小问题:
如何用O(1)时间复杂度求栈中的最小元素
思路如下:
使用两个栈,一个用来存储数据,一个用来存储栈的最小元素,入栈时:如果当前入栈的元素比原来栈中的最小值还小,则把这个最小值保持到栈中,出栈时:如果当前出栈的元素恰好为当前栈中的最小值,保存最小值元素的栈顶元素也出栈,是的最小值是这个被出栈元素入栈之前的最小值。
/**
* 找出栈中的最小元素
*/
class MyStack {
Stack elem;
Stack min;
public MyStack() {
elem = new Stack();
min = new Stack();
}
public void push(int val) {
elem.push(val);
if(min.isEmpty()) {
min.push(val);
}else {
if(val < min.peek()) {
min.push(val);
}
}
}
public int pop() {
int tmp = elem.peek();
elem.pop();
if(tmp == min.peek()) {
min.pop();
}
return tmp;
}
public int min() {
if(min.isEmpty()) {
return Integer.MAX_VALUE;
}else {
return min.peek();
}
}
}
只要创建MyStack类的实例进行栈的相关操作就可以了,Stack类是数组实现的栈——顺序栈。
两个栈实现一个队列:
思路:栈是先进后出,而队列是先进先出,所以我们要用两个栈实现数据先入先出即可,具体过程是先实例化两个空栈s1,s2,然后把数据放入其中一个栈s1里面,再让栈s1中的栈顶元素一次出来到栈栈s2中,再一次得到栈s2的栈顶元素即可。
/**
* 实现入队
* @param s1
* @param val
*/
public static void enterQueue(Stack s1,int val) {
s1.push(val);
}
/**
* 实现出队
* @param s1
* @param s2
* @return
*/
public static int popQueue(Stack s1,Stack s2) {
//1.把s1的数据倒入到s2
//2.得到s2的栈顶元素
int num = -1;
if(s2.isEmpty()) {
while(!s1.isEmpty()) {
//1.得到s1的元素
//2.s2.push();
num = s1.pop();
s2.push(num);
}
}
//把s1的数据全部倒入s2里面
int num2 = -1;
if(!s2.isEmpty()) {
num2 = s2.pop();
}else {
System.out.println("! !");
}
return num2;
}
public static void main(String[] args) {
Stack stack = new Stack();
Stack stack1 = new Stack();
enterQueue(stack,5);
enterQueue(stack,9);
enterQueue(stack,45);
enterQueue(stack,85);
System.out.println(popQueue(stack,stack1));
}
5