算法_栈实现队列篇

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());
        
    

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

232. 用栈实现队列

用栈实现队列

leecode刷题(26)-- 用栈实现队列

leetcode232. 用栈实现队列

leetcode232. 用栈实现队列

算法剑指Offer09-用两个栈实现队列