写在前面:
为了增长一下自己的数据结构能力,也为了面试准备,准备将剑指Offer做一下,并与各位分享,希望各位可以对代码以及思路提提建议,欢迎志同道合者,谢谢。
题目:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:
先分析一下栈和队列,,栈先入先出,队列先入先出,那么怎么模拟呢。有数据 1,2,3,4进队列,,,那么出队顺序应该也是1,2,3,4 但是对于栈来说,出栈顺序是4,3,2,1 但是我们可以再将这个数据按照这个顺序压入另一个栈中,入栈顺序为4,3,2,1 那么出栈顺序就为1,2,3,4
重点:
代码思路是,在入队的时候将数据(三个数据)压入栈1,然后在出队将栈1的数据弹出然后压入栈2(这时候栈2中有三个数据),然后弹出栈2的数据(弹出一个,还剩两个),这就是我们上面的思路,,,,but,重点来了,如果弹出数据之后,然后我们现在又要入队数据了,我们把数据压入栈1 ,然后出队数据,我们把栈1的数据压入栈2,然后弹出栈2的数据,注意,这个数据就是我们刚刚入队的数据,但是我们栈里还有以前的数据呢,是不是顺序就乱了,,,,所以我们在弹出数据之后,应该在把栈2中的数据再次压入栈1中,维持以前数据的顺序,如果你要是在加入数据,也就是压入栈1 的栈顶,弹出的时候,将栈1 的数据压入栈2 ,那么刚刚入队的数据,就在栈2的栈底,也就是会最后一个出场,也就对应了队列的先入先出的顺序,
代码实现:
package com.itzmn.offer;
import java.util.Stack;
/**
* @Auther: 张梦楠
* @Date: 2018/7/28 10:05
* 简书:https://www.jianshu.com/u/d611be10d1a6
* 码云:https://gitee.com/zhangqiye
* @Description: 使用两个栈模拟队列
*/
public class Offer5 {
/**
* stack1 用来入队
* stack2 用来出队
*
* 先入先出
* 1, 2, 3 进栈,出栈顺序为 3,2,1
* 那么将这三个数在压入第二个栈中 入栈顺序为 3,2,1
* 然后出栈顺序就为 1,2,3
* 即可模拟 队列,先入先出
* 栈是先入后出的
*
*/
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public static void main(String[] args) {
Offer5 offer5 = new Offer5();
offer5.pop();
offer5.push(1);
offer5.push(2);
offer5.push(3);
System.out.println(offer5.pop());
offer5.push(5);
offer5.push(4);
System.out.println(offer5.pop());
System.out.println(offer5.pop());
System.out.println(offer5.pop());
}
public void push(int node) {
stack1.push(node);
}
public int pop() {
while (!stack1.empty()){
stack2.push(stack1.pop());
}
if (stack2.isEmpty()){
System.out.println("队列为空");
return -1;
}
Integer pop = stack2.pop();
//将栈中剩余的数据重新压入栈1中,是因为如果后面还有别的数据要入队,也就是入栈的话,可以有顺序
while (!stack2.isEmpty()){
stack1.push(stack2.pop());
}
return pop;
}
}
希望大家可以多多指点,优化一下,
QQ群:552113611