视频教程:帅地玩编程
剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
概念:
栈:先进后出
队列:先进先出
栈:Stack,是Vector的一个子类
声明一个栈的写法:Stack name = new Stack();
队列:queue
push():推进,把一个元素放入栈中
pop():弹出,从栈里弹出一个元素
解题思路:
(1)定义两个栈;
(2)初始化两个栈;
(3)进栈操作;
(4)出栈操作;
首先判断栈2是否为空,如果非空,返回栈2的栈顶;
判断栈1是否为空,如果栈1非空, 把栈1的所有元素放到栈2中,返回栈2的所有元素;
(5)如果两个栈都为空,就返回-1。
class CQueue {
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() {
if(!stack2.isEmpty()){
return stack2.pop();
}
if(!stack1.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}
return -1;
}
}
剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
概念
栈:peek():查看此堆栈顶部的对象,而不从堆栈中删除它。
intValue():
1.intValue()是java.lang.Number类的方法,Number是一个抽象类。Java中所有的数值类都继承它。Integer,Double,Long等都有此方法。
2.此方法的意思是:输出int数据。每个数值类中具体的实现是不同的。
解题思路:
入栈push():
(1)定义两个栈,栈1正常存放元素,栈2存放最小元素;
(2)第一个元素正常入栈1,如果栈2为空,第二个元素就正常入栈2;
(3)第三个元素如果<=栈2的栈顶元素,就放到栈2里,否则放入栈1;
(4)此时,栈1正常存放元素,栈2上面保存的元素永远是最小的元素,从上往下是递增的关系;
出栈pop():
(1)看栈1的栈顶元素和栈2的栈顶元素是否相等,相等则出栈,栈1栈2一起出栈,不相等则不出栈;
时间复杂度O(1),空间复杂度O(n),最差情况下是用了2N的空间复杂度;
class MinStack {
Stack<Integer> stack1;
Stack<Integer> stack2;
/** initialize your data structure here. */
public MinStack() {
this.stack1=new Stack();
this.stack2=new Stack();
}
public void push(int x) {
stack1.push(x);
if(stack2.isEmpty()||x<=stack2.peek().intValue()){
stack2.push(x);
}
}
public void pop() {
if(!stack1.isEmpty()){
//Integer 当数值>127的时候,比较的是对象,需要取到他的值来比较
//否则会出错
if(stack1.peek().intValue()==stack2.peek().intValue()){
stack2.pop();
}
stack1.pop();
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}