剑指offer--算法题--07--两个队列实现一个栈

题目:使用两个队列实现一个栈



package jzoffer;

import java.util.ArrayDeque;
import java.util.Queue;
/*
 * 上一个算法用两个栈实现了一个队列,其实主要是实现队列的add()和poll()这两个方法,实现队列的先进先出规则
 * 那我们这次用两个队列实现一个栈,其实也就是实现栈的push()和pop()这两个方法
 * 还是要实现栈的先进后出规则
 */

public class StacksWithTwoQueue {
	Queue<Integer> queue1 = new ArrayDeque<>(); //在这里先创建两个队列
	Queue<Integer> queue2 = new ArrayDeque<>(); 
	public void push(int node){//先实现栈的push方法 先进后出原则
		if(queue1.isEmpty() && queue2.isEmpty()){
			queue1.add(node);//如果两个队列都为null的话,那么我们优先往队列1的里面添加元素然后结束方法
			return;          //添加的话队列和栈差不多
		}
		if(queue1.isEmpty() && !queue2.isEmpty()){//如果队列1为null 2 不为null的话
			queue2.add(node);//那么我们直接给队列2里面添加
			return;
		}
		if(queue2.isEmpty()){//如果队列2为null的话,向1里面进行添加元素
			queue1.add(node);
			return;
		}
	}
	public int pop(){//紧接着我们来实现栈的pop方法 先进后出原则
		if(queue1.isEmpty() && queue2.isEmpty()){ //如果两个队列都为nll的话,需要抛出异常
			try {
				throw new Exception("stack is empty");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		if(queue1.isEmpty()){
			while(queue2.size()>1){//如果1为空的话,小判断2的大小,如果个数大于1的话-
				queue1.add(queue2.poll());//我们将2里面的弹出一个放入队列1
			}
			return queue2.poll(); //如果2里面小于一个的话那么我们直接弹出就好了
		}
		if(queue2.isEmpty()){//下来我们按照上面继续判断2里面的
			while(queue1.size()>1){
				queue2.add(queue1.poll());
			}
			return queue1.poll();
		}
		return 0;
	}
	public static void main(String[] args) {
		StacksWithTwoQueue awtq = new StacksWithTwoQueue();
		awtq.push(1);
		awtq.push(2);
		awtq.push(3);
		awtq.push(4);
		System.out.println(awtq.pop());
		System.out.println(awtq.pop());
		awtq.push(5);
		System.out.println(awtq.pop());
		System.out.println(awtq.pop());
		System.out.println(awtq.pop());
	}
}

猜你喜欢

转载自blog.csdn.net/lsm18829224913/article/details/80304671