面试题8-使用2个栈实现一个队列

题目要求

用两个栈实现一个队列。队列的声明如下:请实现他的两个功能 appenfTail 和deleteHead,分别完成在为节点添加和在队列头部删除功能

题目解析

思路一:

  • 分析

定义两个stack,暂定为A栈 , B栈
当压入元素时,我们将元素都压入A栈。
当需要删除队列头元素时,我们可以将A栈的元素全部取出并压入B栈。
此时B栈中的栈顶元素就是最初压入的元素。要删除的话,抛出栈顶元素即可
所以我们在删除队尾,需要判断B栈为空,如果不为空那么直接抛出栈顶元素。
如果为空,将A栈元素一一抛出在压入B栈

  • 代码段
private Stack<T> appendStack = new Stack<T>() ;
    private Stack<T> deleteStack = new Stack<T>() ;
    
    public void appendfTail(T t) {
        
        appendStack.push(t) ;
        
    }
    
    public T deleteHead() throws Exception {
        
        if(deleteStack.isEmpty()) {
            while(!appendStack.isEmpty()) {
                deleteStack.push(appendStack.pop()) ;
            }
        }
        
        if(deleteStack.isEmpty()) {
            throw new Exception("队列为空 , 不能删除") ;
        }
        
        return deleteStack.pop() ;
        
    }

测试代码

    public static void main(String[] args) {
        
        Demo<String> demo = new Demo<>() ;
        
        demo.appendfTail("我");
        demo.appendfTail("爱");
        demo.appendfTail("学");
        demo.appendfTail("习");
        
        for(int i = 0 ; i < 4 ; i++) {
            
            try {
                System.out.println(demo.deleteHead());
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
        
        System.out.println("------------------------------------");
        
        try {
            System.out.println(demo.deleteHead());
        } catch (Exception e) {
            
            System.out.println(e.getMessage());
        }
            
    }

运行结果




队列为空 , 不能删除


看完整源码戳源码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容