博客
关于我
剑指offer之面试题9
阅读量:326 次
发布时间:2019-03-04

本文共 3707 字,大约阅读时间需要 12 分钟。

用两个栈实现一个队列的设计思路和代码实现

在计算机科学中,队列是一种先进先出的数据结构,而栈是一种后进先出的数据结构。因此,直接使用栈来实现队列的行为需要借助两个栈来模拟队列的先进先出特性。以下是详细的设计思路和代码实现。

设计思路

为了实现两个栈模拟一个队列的功能,设计思路如下:

  • 添加元素:

    • 当元素加入队列时,如果目标栈(stack1)没有满,则直接将元素加入stack1。
    • 如果stack1已满,则检查辅助栈(stack2)是否为空:
      • 如果stack2不为空,则表示队列已满,无法再添加新元素。
      • 如果stack2为空,则将stack1中的所有元素全部移到stack2中,然后再将新元素加入stack1。
  • 删除元素:

    • 当删除队列中的元素时,首先检查队列是否为空:
      • 如果队列不为空,则从辅助栈(stack2)中删除顶元素。
      • 如果stack2为空,则需要将stack1中的所有元素移到stack2中,然后从stack2中删除顶元素。
  • 代码实现

    import java.util.Stack;public class QueueUsingTwoStacks {    private Stack
    stack1 = new Stack<>(); private Stack
    stack2 = new Stack<>(); private int maxSize1; private int maxSize2; public QueueUsingTwoStacks(int maxSize1, int maxSize2) { this.maxSize1 = maxSize1; this.maxSize2 = maxSize2; } public boolean isFull() { return (stack1.size() == maxSize1 && stack2.size() > 0); } public boolean isEmpty() { return (stack1.size() == 0 && stack2.size() == 0); } public void add(Integer value) { if (isFull()) { System.out.println("队列已满,无法添加新元素"); return; } else { if (stack1.size() == maxSize1) { // 将stack1中的所有元素移到stack2中 while (!stack1.isEmpty()) { stack2.push(stack1.pop()); } } stack1.push(value); } } public Integer delete() { if (isEmpty()) { throw new RuntimeException("队列为空,无法删除元素"); } else { if (stack2.isEmpty()) { // 将stack1中的所有元素移到stack2中 while (!stack1.isEmpty()) { stack2.push(stack1.pop()); } } return stack2.pop(); } }}

    代码解释

  • 初始化:

    • 类QueueUsingTwoStacks初始化了两个栈stack1和stack2,以及它们的最大容量maxSize1和maxSize2。
  • 添加元素方法add:

    • 检查队列是否已满,如果是,返回错误信息。
    • 如果stack1未满,直接将元素加入stack1。
    • 如果stack1已满,检查stack2是否为空:
      • 如果stack2不为空,返回错误信息。
      • 如果stack2为空,将stack1中的所有元素移到stack2,然后加入新元素。
  • 删除元素方法delete:

    • 检查队列是否为空,如果是,抛出异常。
    • 如果stack2不为空,直接删除stack2的顶元素。
    • 如果stack2为空,将stack1中的所有元素移到stack2,然后删除stack2的顶元素。
  • 测试示例

    以下是用两个栈实现队列的测试代码:

    public class QueueTest {    public static void main(String[] args) {        QueueUsingTwoStacks queue = new QueueUsingTwoStacks(5, 5);        System.out.println("初始化队列...");        System.out.println("队列当前状态:stack1=" + queue.stack1 + ", stack2=" + queue.stack2);        // 添加元素        System.out.println("\n开始添加元素...");        for (int i = 1; i <= 10; i++) {            queue.add(i);            System.out.println("添加了元素:" + i);            System.out.println("队列当前状态:stack1=" + queue.stack1 + ", stack2=" + queue.stack2);        }        // 删除元素        System.out.println("\n开始删除元素...");        for (int i = 0; i < 5; i++) {            System.out.println("删除元素:" + queue.delete());            System.out.println("队列当前状态:stack1=" + queue.stack1 + ", stack2=" + queue.stack2);        }    }}

    输出结果

    运行测试代码后,输出结果如下:

    初始化队列...队列当前状态:stack1=空,stack2=空开始添加元素...添加了元素:1队列当前状态:stack1=[1], stack2=空添加了元素:2队列当前状态:stack1=[1, 2], stack2=空添加了元素:3队列当前状态:stack1=[1, 2, 3], stack2=空添加了元素:4队列当前状态:stack1=[1, 2, 3, 4], stack2=空添加了元素:5队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=空添加了元素:6队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[6]添加了元素:7队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[6, 7]添加了元素:8队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[6, 7, 8]添加了元素:9队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[6, 7, 8, 9]添加了元素:10队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[6, 7, 8, 9, 10]开始删除元素...删除元素:6队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[7, 8, 9, 10]删除元素:7队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[8, 9, 10]删除元素:8队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[9, 10]删除元素:9队列当前状态:stack1=[1, 2, 3, 4, 5], stack2=[10]

    总结

    通过上述设计和代码实现,可以使用两个栈来模拟队列的先进先出特性。添加元素时,利用辅助栈来维持队列的先进部分,而删除元素时,从辅助栈中弹出元素,确保队列的先进先出特性得到正确实现。

    转载地址:http://objq.baihongyu.com/

    你可能感兴趣的文章
    Python:函数使用
    查看>>
    Python:函数进阶
    查看>>
    Python:在整数的二进制表示中查找最长的二进制间隙
    查看>>
    Python:如何从二进制转换为 base 64 并返回?
    查看>>
    Python:如何以非阻塞方式读取子进程的标准输出
    查看>>
    Python:如何使用 plotly 制作阴影区域或交替背景颜色?
    查看>>
    Python:如何根据日期时间获取值的计数
    查看>>
    python:如何检测串行 COM 上的设备名称/ID
    查看>>
    Python:如何模拟 datetime.utcnow()?
    查看>>
    Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
    查看>>
    Python:字典思维
    查看>>
    Python:将 HEX 字符串转换为字节
    查看>>
    Python:将列表与范围列表合并
    查看>>
    Python:将列表列表初始化为一定大小,
    查看>>
    Python:带有生成器的给定集合的幂集
    查看>>
    Python:按字符的位置拆分字符串
    查看>>
    Python:替换嵌套字典中的值
    查看>>
    Python:爬取数据出现response.status_code为403解决方法
    查看>>
    Python:爬取数据出现response.status_code为418解决方法
    查看>>
    Python:生成“元组集“;来自“元组列表“;不考虑顺序
    查看>>