欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java实现的用两个栈实现队列

程序员文章站 2022-07-12 09:51:23
...

记得一次面试被问到的一道题, 过后仔细想了一下 , 想出了两个实现方法, 但是思路是一样的
思路 :

  • 两个栈 A , B .
  • 入时保证A有(当然这时候如果B必须为空, 即使不为空,也要都放到A里)
  • 出时保证B有(这个时候A必须为空, 即使不为空,也要都放到B里)
    可能觉得 , 没理解 , 其实后面两个来回换的步骤 , 只是因为栈的特性是先入后出 , 但是队列是先入先出的 , 所以, 只能用
    一个A栈入队 , 然后在出的时候 , 把这个A栈里的数据弹出来, 依次放到B栈中 , 注意,这个时候,出站的时候直接以B出站 , 为什么呢? 因为A再弹栈然后放入B栈时, 这个时候B栈里的顺序已经改变了, 所以B再弹栈时肯定是对的
    举个栗子 :
  • 有1 , 2 , 3, 4 这四个数 , 如果放到队列中 , 1数字先进 , 出的时候肯定也是 1
  • 把数字放入A栈中 , 这是A栈里出栈顺序是 : 4->3->2->1 , 因为栈时先进后出的嘛,
  • 这个时候要出栈了 , 再拿一个B栈 , 把A弹栈顺便放到B栈里
  • 那么B栈的出栈顺序就是 : 1->2->3->4
    如果没懂 , 按照这个顺序画个图 , 一下子就明白了
    上代码:
public static void test1(){
		for(int i=0; i<5; i++){
			inQueue(i);
		}
		System.out.println(outQueue());
		inQueue(5);
		System.out.println();
		Integer d = null;
		do{
			d = outQueue();
			System.out.println(d);
		}while(d!=null);
	}
	
	//入队,入队都是入的stack1,保证stack2没有数据
	public static void inQueue(int data){
		transData(stack2, stack1);
		stack1.push(data);
	}
	//出队,出队都是入的stack2,保证stack1没有数据
	public static Integer outQueue(){
		transData(stack1, stack2);
		int data = 0;
		if(!stack2.isEmpty()){
			data = stack2.pop();
			return data;
		}else{
			System.out.println("队列为空!");
		}
		return null;
	}
	//将a栈数据放入b栈
	public static void transData(Stack<Integer> a, Stack<Integer> b){
		while(a.size()>0){
			b.push(a.pop());
		}
	}

嫌麻烦比较多? 来个代码少的

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
        if(stack2.size() == 0) {
            while(!stack1.isEmpty()) {
                int temp = stack1.peek();
                stack2.push(temp);
                stack1.pop();
            }
        }
        int res = stack2.peek();
        stack2.pop();
        return res;
    }
}

其实思路都是一样的 , 至于实现形式 , 看你自己了

如果错误 , 请多多指点.