1. 用两个栈实现队列
题目:
用两个栈实现一个队列。实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。
题解:
-
初始化两个整数栈命名为
stack1
和stack2
, -
其中stack1用来存储数据,stack2辅助stack1完成删除头部的功能。
-
两个函数appendTail 和 deleteHead 的具体实现
- appendTail 直接执行stack1.push(),将stack1的上面当作尾部
- deleteHead 将stack1的数据全部pop到stack2中,去除stack2的栈顶元素,再将stack2的元素pop至stack1中
public class CQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value) {
stack1.add(value);
}
public int deleteHead() {
int res;
if (stack1.size()==0){
return -1;
}else if (stack1.size()==1){
return stack1.pop();
}else {
while (stack1.size()!=0){
stack2.push(stack1.pop());
}
res = stack2.pop();
while (stack2.size()!=0){
stack1.push(stack2.pop());
}
return res;
}
}
}
2.包含min函数的栈
题目:
定义栈的数据结构,实现push()、top()、pop()、min(),时间复杂度都是 O(1)
题解:
- 使用两个栈stack1和stack2,其中stack1用来完成普通的push()、top()、pop()三个操作,stack2中将最小的数据放在栈顶,即只有需要push的数据小于或等于stack2的栈顶元素才会被stack2接收
- push(x)
- stack1.push(x)
- 当stack2为空 || x<=stack2的栈顶元素,执行 stack2.push(x);
- top()
- 返回stack1的栈顶元素 stack1.peek();
- pop()
- stack1.pop()
- 如果stack1的pop()的Integer 等于 stack2的栈顶元素,则stack2的栈顶元素也需要pop()
- min() 返回stack2的栈顶元素
public class MinStack {
Stack<Integer> stack1;
Stack<Integer> stack2;
public MinStack() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x) {
stack1.push(x);
if (stack2.empty() || stack2.peek() >= x){
stack2.push(x);
}
}
public void pop() {
if(stack1.pop().equals(stack2.peek()))
stack2.pop();
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
总结:
- == 只能用来比较基本数据类型,对于非基本数据类型应该调用equals()方法
- 比如在执行pop()方法时,判断stack1的栈顶元素和stack2的栈顶元素是否相等时,由于stack的数据类型为Integer,因此二者比较是否相等时应调用equals()而不是==
在这个世界上,不是所有合理的和美好的都能按照自己的愿望存在或实现。