跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。
- 不积硅步,无以至千里;
- 不积小流,无以成江海。
题目描述
牛客网剑指offer编程题第5题–两个栈实现队列,用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
我的想法
- 栈的特点是先进后出,队列的特点是先进先出
- 其实就是一个顺序的问题,最直接的想法就是,一个栈用作进栈,另外一个栈用作出栈。
- 比如将12345存到栈1,取出时,将其先从栈1弹出后又存到栈2,然后再弹出,这样顺序又正过来了。经过一次进栈和出栈顺序变化一次。
- 需要思考的问题是push()和pop()可能间隔出现,而不是像上面先全部push(),再全部pop()。
解题方法
//创建两个栈,一个用作进栈,一个用作出栈
static Stack<Integer> stack1 = new Stack<Integer>();
static Stack<Integer> stack2 = new Stack<Integer>();
//栈1负责进栈
public static void push(int node) {
stack1.push(node);
}
public static int pop() {
//栈中没有元素
if(stack1.empty()&&stack2.empty()){
throw new RuntimeException("Queue is empty!");
}
//取出元素时栈2为空,这时就要将栈1中的元素全部先搬运到栈2,再出栈。
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
//栈1和栈2都不为空,这时先不要从栈1中搬元素过来,因为还有以前搬的没出去
//所以这里直接将栈2元素出栈,这样就可以解决pop()和push()交叉出现的问题
return stack2.pop();
}
代码测试
package com.learnjiawa.jzoffer;
import java.util.Stack;
/**
* @author zouhuayu
* 2019-12-04-9:17
*/
public class Solution5 {
public static void main(String[] args) {
push(1);
push(2);
push(3);
System.out.print(pop());
System.out.print(pop());
push(4);
push(5);
System.out.print(pop());
System.out.print(pop());
System.out.print(pop());
}
//创建两个栈,一个用作进栈,一个用作出栈
static Stack<Integer> stack1 = new Stack<Integer>();
static Stack<Integer> stack2 = new Stack<Integer>();
//栈1负责进栈
public static void push(int node) {
stack1.push(node);
}
public static int pop() {
//栈中没有元素
if(stack1.empty()&&stack2.empty()){
throw new RuntimeException("Queue is empty!");
}
//取出元素时栈2为空,这时就要将栈1中的元素全部先搬运到栈2,再出栈。
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
//栈1和栈2都不为空,这时先不要从栈1中搬元素过来,因为还有以前搬的没出去
//所以这里直接将栈2元素出栈,这样就可以解决pop()和push()交叉出现的问题
return stack2.pop();
}
}
控制台输出结果:
总结
这种简单的数据结构题做着还是特别有意思的,可以锻炼自己的思维和编程能力,明天继续啦!
点击看剑指offer编程题打卡系列所有博客.
参考文献
[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.
更多
对我的文章感兴趣,持续更新中…
关注我,看其他系列博客,《跟凑弟弟一起修炼集合框架》、《Java多线程大闯关》、《Java IO流大闯关》。