算法_栈实现队列篇

Posted 葡萄籽-June

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法_栈实现队列篇相关的知识,希望对你有一定的参考价值。

用2个栈实现队列

本篇算法主要是通过栈的特性实现队列的思想。



前言

简单描述栈与队列的概念等内容。

栈特点:
(1)栈只能从表的一端存取数据,另一端是封闭的。(只能在栈顶进行删除(pop),插入(push)操作。)
(2)在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。

队列特点:
(1)队列访问元素的顺序不是后进先出(LIFO),而是先进先出(FIFO)。
(2)当一个元素被添加到队列中时,它被添加到后面。当一个元素从队列中移除时,它将从前面移除。队列的两个主要操作就是入队(enqueue)和出队(dequeue)。


一、题目(两个栈来实现一个队列)

用两个栈来实现一个队列: 分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。
队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。

示例:
输入: ["PSH1","PSH2","POP","POP"]
返回: 1,2

解析:
"PSH1":代表将1插入队列尾部
"PSH2":代表将2插入队列尾部
"POP“:代表删除一个元素,先进先出=>返回1
"POP“:代表删除一个元素,先进先出=>返回2

思路:
1、根据栈的特性以及相应的队列的特性可知,需把栈的先进后出转变为先进先出。
2、如何用2个栈将先进后出的特性转为先进先出,大致思路如下图所示:

二、实现代码

/**
     * 两个栈实现一个队列
     */
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

//  主函数入口
    public static void main(String[] args) {
        StackImplQueue stackImplQueue = new StackImplQueue();

        String[] arr = {"PSH1", "PSH2", "POP", "POP"};

//        System.out.println(arr[0].substring(0,3).equals("PSH"));
//        截取字符串
        for (int i = 0; i < arr.length; i++) {
            String pushInvalid = arr[i].substring(0, 3);
//            判断是否是PSH,若是则执行push操作
            if (pushInvalid.equals("PSH")) {
//                截取PSH后的数字并转为int类型放入栈中
                int pushNum = Integer.parseInt(arr[i].substring(3));
                stackImplQueue.push(pushNum);
            } else if (pushInvalid.equals("POP")) {
//            判断是否是POP,若是则执行pop操作
                stackImplQueue.pop();
            } else {
                System.out.println("输入格式不符合要求~");
            }
        }

    }

    /**
     * 尾部插入内容,插入整数
     */
    public void push(int node) {
        stack1.push(node);
    }

    /**
     * 头部删除内容
     * need:0 则进行出栈操作
     */
    public void pop() {
		//判断栈1为不为空
        while (!stack1.isEmpty()) {
            //将栈1中的所有数放入到栈2中
            stack2.push(stack1.pop());
        }
        if (!stack2.isEmpty()) {
            //栈2栈顶元素出栈
            int x = stack2.pop();
            System.out.println(x);
        }
        //判断栈2为不为空
        while (!stack2.isEmpty()) {
            //将栈2剩余的元素放入到栈1中
            stack1.push(stack2.pop());
        }
    }

以上是关于算法_栈实现队列篇的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法篇-队列实现栈

[算法] leetcode栈与队列相关题目详解

数据结构与算法:栈+队列+递归

栈与队列篇_栈的应用合集

算法(第四版)C#题解——1.3.49 用 6 个栈实现一个 O 队列

代码随想录算法训练营第10天 | ● 理论基础 ● 232.用栈实现队列 ● 225. 用队列实现栈