基础算法面试题---如何用栈实现队列

题目描述

如何用栈结构实现队列的push和pop操作。

队列和栈的概念

队列:先进先出,从头进,从尾出。

栈:先进后出,从头进,从头出。

解题思路

一个栈是无法完成队列的,本题我们可以通过两个栈来实现,一个栈专门用来添加元素,另一个栈专门用来取出元素。

假设分别设添加元素的栈为:A,取元素的栈为:B。
每次数据都push到A栈中,当需要pop时,如果B栈为空,则一次性把用来A栈数据全部弹出并添加到B栈,否则直接从B栈弹出,这样即实现了队列的操作。

图解分析

1、假设现在要添加了3个元素,分别为:1,2,3
在这里插入图片描述
2、现在需要弹出一个元素,首先判断B栈是否为空,此时B栈是为空的,那么则一次性把A栈数据全部弹出到B栈。

在这里插入图片描述

3、然后从B栈弹出一个元素,就是1(1是先进的,现在也先出了,符合队列结构)。

在这里插入图片描述

4、此时如果又需要添加一个元素4,则继续向A栈添加。

在这里插入图片描述
5、当再又元素要弹出时,因为B栈不为空,所以直接从B栈弹出。

扫描二维码关注公众号,回复: 12894477 查看本文章

在这里插入图片描述

代码实现

import java.util.Stack;

public class Code_StackImplQueue<E> {
    
    
    Stack<E> stack_a = new Stack<>();
    Stack<E> stack_b = new Stack<>();

    public static void main(String[] args) {
    
    
        Code_StackImplQueue c = new Code_StackImplQueue();
        c.push(1);
        c.push(2);
        c.push(3);
        System.out.println("push: 1,2,3");
        System.out.println("pop:" + c.pop() + "," + c.pop() + "," + c.pop());

    }

    /**
     * 每次push元素时都push到stack_a栈中
     *
     * @param e
     */
    public void push(E e) {
    
    
        stack_a.push(e);
    }

    public E pop() {
    
    
        /**
         * 如果stack_b为空,则需要把stack_a的元素全部弹出并push到stack_b中
         */
        if (stack_b.empty()) {
    
    
            while (!stack_a.empty()) {
    
    
                stack_b.push(stack_a.pop());
            }
        }
        //如果stack_b还为空,则表示stack_a也为空,则直接返回null
        if (stack_b.empty()) {
    
    
            return null;
        }
        //从stack_b取出元素
        return stack_b.pop();
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSDN_WYL2016/article/details/113730657