专栏持续更新50道算法题,都是大厂高频算法题,建议关注, 一起巧‘背’算法!
文章目录
- 题目
- 解法
- 总结
题目
解法
- 先搞清队列与栈的特点:队列先进先出,栈先进后出
- 两个栈的分工:栈A入数据,栈B出数据
- 需要保证取数据时栈A是空的,保证队列的先进先出
- 在第三步的基础上,如果栈B没有元素(即两个栈都空),返回-1
public class Offer09 {
private Deque<Integer> stack1;
private Deque<Integer> stack2;
public Offer09() {
stack1 = new LinkedList<>();
stack2 = new LinkedList<>();
}
public void appendTail(Integer number) {
stack1.push(number);
}
public int deleteHead() {
// 将栈a元素放入栈b
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
// 如果两个栈都没有元素就返回-1
if (stack2.isEmpty()) {
return -1;
} else {
// 如果出栈的集合中有元素就弹出一个
return stack2.pop();
}
}
}
总结
做这道题需要对队列,栈的基本结构清晰。在考虑取数的时候,第一次做这道题的时候考虑了栈B还未完全清空就插入数据的问题。实际是不用担心的,因为删除的时候会先把栈A的数据全部导入栈B
留一个思考题:把导数的逻辑放到添加的方法里是否可以?