用两个栈实现队列(剑指offer第五题)

一、题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

二、思路解析

     方法一、自己的笨方法

 stack1的状态stack2的状态
 如果stack1为空且stack2非空时如果stack2为空且stack1非空时
入队先入队,再将stack2倒腾过来先倒腾到stack1,再入栈
出队先倒腾到stack2中,再出栈直接出栈

     方法二、左程云大佬书里的方法

    大佬的思想很精彩,stack1的用途是用来入队的,每次入队时都执行stack1入栈;而stack2是用来出队的,每次出队时都从stack2出栈,但是要注意的是如果执行出队时,stack2中没元素了,那就把stack1中的全部出栈到stack2中,再来stack2出栈,完成出队效果。

三、可以运行的java代码

  方法一、自己写的代码

import java.util.Stack;
//用两个栈实现一个队列的push和pop方法
public class Solution_5 {
	  Stack<Integer> stack1 = new Stack<Integer>();
	    Stack<Integer> stack2 = new Stack<Integer>();
	   
	    public void push(int node) {
	        if(stack1.isEmpty()&&stack2.isEmpty()){   //满足初始化条件都为空
	        	stack1.push(node);
	        	return;
	        }else if(stack1.isEmpty()&&!stack2.isEmpty()){  //先入再倒
	        	stack1.push(node);    
	        	while (!stack2.empty()) {
				  stack1.push(stack2.pop());
				}
	        }else if(stack2.isEmpty()&&!stack1.isEmpty()){   //先倒再入
	        	while (!stack1.empty()) {
					  stack2.push(stack1.pop());
					}
		        	stack2.push(node);
	        }
	    }
	    
	    public int pop() {
	    	 if(stack1.isEmpty()&&!stack2.isEmpty()){  //先倒再出
		        	while (!stack2.empty()) {
					  stack1.push(stack2.pop());
					}
		        	return stack1.pop();
		        }
		        	return stack1.pop();  //直接出
	    }
	    
	    public static void main(String[] args) {
			Solution_5 s = new Solution_5();
		    //先入队五个数1,2,3,4,5
			s.push(1);
			s.push(2);
			s.push(3);
			s.push(4);
			s.push(5);
			//再出队
		    while(!s.stack1.empty()||!s.stack2.empty()){
		    	System.out.println(s.pop());
		    }
		}
}

方法二、左程云书里的代码

import java.util.Stack;
 
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(stack1.empty()&&stack2.empty()){
            throw new RuntimeException("Queue is empty!");
        }
        if(stack2.empty()){
            while(!stack1.empty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
} 

四、总结

     冰冻三尺非一日之寒,java程序员的内功是离不开算法修炼的,大公司招聘都要问算法的,因为可以把聪明和勤奋的人挑选出来。

此言希望可以与读者共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值