博客
关于我
剑指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/

    你可能感兴趣的文章
    nmon_x86_64_centos7工具如何使用
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.7 Parameters vs Hyperparameters
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    nnU-Net 终极指南
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    NO 157 去掉禅道访问地址中的zentao
    查看>>
    no available service ‘default‘ found, please make sure registry config corre seata
    查看>>
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    查看>>
    no connection could be made because the target machine actively refused it.问题解决
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>