小米三面算法:两个栈实现一个队列功能

博客讲述了在小米三面时遇到的一道算法题,即如何用两个栈实现队列功能。作者分析了错误的代码实现,并解释了问题出在pop方法的循环条件上。通过调整代码,成功修正了出栈顺序,实现了预期功能。优化后的代码简化了push操作,确保了队列的正确输出顺序。
摘要由CSDN通过智能技术生成

小米三面时,面试官给出了一个算法题,题目如下:用两个栈实现一个队列的功能,如:输入1,2,3,4,5,6;输出1,2,3,4,5,6。

 解题思路:输入数据时,将数据输入到栈1,输出数据时,先判断栈2中是否有数据,若有直接出栈,若无则将栈1中数据全部入栈2,之后再将栈2中数据出栈。如下图所示:

按照该思路,进行了代码线上编写,运行后发现出栈顺序是错误的,而且面试官指出push时直接入栈即可,没必要执行判断和循环。编写的代码如下:

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        //判断2是否空,若空1中数据全部入2,
        if(stack2.isEmpty() && !stack1.isEmpty()) {
            for(int i = 0;i<stack1.size();i++){
                stack2.push(stack1.pop());
            }
        }
        //正常入1
        stack1.push(node);
    }
    
    public int pop() {
        //判断2是否为空,若为空1中数据入2
        if(stack2.isEmpty() && !stack1.isEmpty()) {
            for(int i = 0;i<stack1.size();i++){
                stack2.push(stack1.pop());
            }
        }
        //正常出2
       return stack2.pop();
    }
}

面试结束后,自己复盘时,发现push时判断和循环的操作时多余的,但为什么结果错误呢?断点后发现是pop中for循环条件【i<stack1.size()】导致的,因为该值一直在变。更改后代码如下:

    @Test
    public void test3() {
        Solution solution = new Solution();
        solution.push(1);
        solution.push(2);
        System.out.println("出栈数据:" + solution.pop());
        solution.push(3);
        System.out.println("出栈数据:" + solution.pop());
        System.out.println("出栈数据:" + solution.pop());

        solution.push(4);
        solution.push(5);
        solution.push(6);
        System.out.println("出栈数据:" + solution.pop());
        System.out.println("出栈数据:" + solution.pop());
        System.out.println("出栈数据:" + solution.pop());
    }

    class Solution {
        Stack<Integer> stack1 = new Stack<Integer>();
        Stack<Integer> stack2 = new Stack<Integer>();

        public void push(int node) {
            stack1.push(node);
            System.out.println("----- 入栈数据:" + node);
        }

        public int pop() {
            //判断2是否为空,若为空1中数据入2
            if(stack2.size() == 0) {
                int size = stack1.size();
                for(int i = 0;i< size;i++){
                    Integer pop = stack1.pop();
                    stack2.push(pop);
                }
            }
            //正常出2
            return stack2.pop();
        }
    }

输出结果:

----- 入栈数据:1
----- 入栈数据:2
出栈数据:1
----- 入栈数据:3
出栈数据:2
出栈数据:3
----- 入栈数据:4
----- 入栈数据:5
----- 入栈数据:6
出栈数据:4
出栈数据:5
出栈数据:6

-------------------------------分------------割----------线---------------------------------------------------------- 
  
自己为了加深理解编写,若有误望指正,不喜勿喷~~
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LED点阵显示屏(完整源程序版) 目 录 引言 ……………………………………………………………………1 1 系统的设计与分析 ………………………………………………2 1.1 LED点阵控制原理………………………………………………………………3 1.1.1 LED简介 ……………………………………………………………………3 1.1.2 LED点阵 ……………………………………………………………………4 1.1.3 显示原理 ……………………………………………………………………5 1.1.4显示屏的原理图及结构 ……………………………………………………6 1.2 单片机小系统 …………………………………………………………………8 1.2.1 51系列单片机的概述 ………………………………………………………8 1.2.2单片机的组成 ………………………………………………………………8 2 程序设计 ………………………………………………………10 2.1 系统程序的框架………………………………………………………………10 2.1.1 串口通讯协议………………………………………………………………10 2.1.2 显示处理效果函数…………………………………………………………10 2.1.3 显示函数……………………………………………………………………10 2.2 程序流程图……………………………………………………………………9 3 总结 ………………………………………………………………11 谢辞 …………………………………………………………………13 参考文献 ……………………………………………………………14 附录(所有的源程序)………………………………………………15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值