zoukankan      html  css  js  c++  java
  • 栈和队列:两个栈组成队列

    要求:编写一个算法,用两个栈实现队列,支持队列的基本操作(add, peek, pop)。

    思路:栈的特点是先进后出,而队列的特点是先进先出。

    所以为实现队列元素的进出方法,我们可以用两个栈正好把顺序颠倒过来。

    具体实现是将一个栈作为压入栈,所以往队列里添加的数据都压入这个栈,记为 in;

    另一个栈弹出栈,所有对队列元素进行获取的操作都在这个栈进行,记为 out;

     操作如图所示

    需要注意的两点:

    1. 每次将 in 中的数据压入 out 时,必须把 in 中所有数据一次性压入。

    2. 如果 out 中不为空,则决不能往其中压入数据。

     违反上述两点都会产生错误。

    import java.util.*;
    
    public class TwoStacksQueue
    {
        Stack<Integer> in;
        Stack<Integer> out;
    
        public TwoStacksQueue()
        {
            in = new Stack<Integer>();
            out = new Stack<Integer>();
        }
    
        public void add(int x)
        {
            in.push(x);
        }
    
        public int peek()
        {
            if(in.isEmpty() && out.isEmpty())
            {
                throw new RuntimeException("Queue is Empty!");
            }
            else if(out.isEmpty())
            {
                while(!in.isEmpty())
                {
                    out.push(in.pop());
                }
            }
    
            return out.peek();
        }
    
        public int pop()
        {
            if(in.isEmpty() && out.isEmpty())
            {
                throw new RuntimeException("Queue is Empty!");
            }
            else if(out.isEmpty())
            {
                while(!in.isEmpty())
                {
                    out.push(in.pop());
                }
            }
    
            return out.pop();
        }
    }

     参考资料:程序员代码面试指南IT名企算法与数据结构题目最优解, 左程云

  • 相关阅读:
    浅谈软件开发项目的质量控制
    分布式系统稳定性模式
    正确使用 Volatile 变量
    我和 OI 的一些故事
    NOIP2020 退役记
    博弈论基础入门
    [HAOI2008]硬币购物(容斥/背包DP)
    [CF] 1307F Cow and Vacation(思维/贪心)
    [noi.ac 模拟赛8] c(容斥/DP)
    [noi.ac 模拟赛9] A.出征准备(同余最短路)
  • 原文地址:https://www.cnblogs.com/2015110615L/p/6658600.html
Copyright © 2011-2022 走看看