Day01_剑指Offer
Day01_剑指Offer
坚持30天,看看成效。小目标
一天两道剑指Offer题,大家都有美好的未来。加油!!!
package com.sorrymaker.day2501;
import java.util.Stack;
/**
*
* 题目:用两个栈实现一个队列。
* 队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
* 分别完成在队列尾部插入整数和在队列头部删除整数的功能。
* (若队列中没有元素,deleteHead 操作返回 -1 )
* @Author nextGame
* @Date 2021/8/12 22:47
* @Version 1.0
*/
public class CQueue {
//Stack 的实现是线程安全的,所以性能比LinkedList低。
//LinkedList实现了Deque的接口
//(顶级接口)Collection-->Queue-->Deque-->LinkedList(实现类)
//所以这里不用Stack的话,用Deque的话,效率会更高,但不是线程安全的。
//先定义两个栈 stack1 ,stack2. stack1支持插入,stack2为删除
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue() {
//初始化
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
//短路与, 第一个为真的时候,才会判断第二个是不是也为真,第一个不为真,直接跳过判断第二个条件,提高效率。
//当第一个栈和第二个栈都为空,说明队列里面没有元素了,所以返回-1.
if (stack1.isEmpty() && stack2.isEmpty()) {
return -1;
//当第二个栈(删除的栈)为空时候
} else if (stack2.isEmpty()) {
//循环语句判断第一个栈是否不为空,不为空就把第一个栈的所有元素,pop出去,然后push进第二个栈。
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
//上面的判断语句都过完之后,最后把第二个栈的元素都pop出来。
return stack2.pop();
}
}

package com.sorrymaker.day2501;
import java.util.Stack;
/**
* @Author nextGame
* @Date 2021/8/12 23:24
* @Version 1.0
*/
public class MinStack {
//A栈是主栈,B栈是辅助栈,确保B栈是非严格降序的。
//创建栈A,B
Stack<Integer> A, B;
public MinStack() {
//初始化栈A、B
A = new Stack<>();
B = new Stack<>();
}
public void push(int x) {
//栈A新加 x 。
A.add(x);
//当B为空,B也同步加,当B不为空,判断B栈里面的元素是否大于等于x,(这里等于是避免加入的值恰好是b栈最小值)
if(B.empty() || B.peek() >= x) {
//B栈新加 x元素
B.add(x);
}
}
public void pop() {
//当A栈要pop元素出去,要同步B栈,假如A栈pop的元素恰好是B栈的栈顶(最小值),那B栈也同步pop出栈顶元素。
if(A.pop().equals(B.peek())){
B.pop();
}
}
public int top() {
//要得到top, 既A栈的栈顶, 直接调用A.peek(),返回A栈的栈顶。
return A.peek();
}
public int min() {
//由于B栈是非严格降序的,所以B栈里面已经是排好序的了,我们只需要获取B栈的栈顶,就是当前A栈的最小值。
return B.peek();
}
}


浙公网安备 33010602011771号