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

    你可能感兴趣的文章
    Oracle未开启审计情况下追踪表变更记录
    查看>>
    Oracle条件查询
    查看>>
    Oracle查看数据库会话连接
    查看>>
    Oracle查询前几条数据的方法
    查看>>
    oracle树形查询 start with connect by
    查看>>
    oracle毕业论文题目,历届毕业论文申报题目大全.doc
    查看>>
    oracle求助---win7下oracle配置相关疑问Starting Oracle Enterprise Manager 10g Database Control ...发生系统错误 5。
    查看>>
    Oracle流程控制语句
    查看>>
    oracle深度解析检查点
    查看>>
    Oracle游标
    查看>>
    oracle游标数最大数,Oracle 最大连接数 最大游标数
    查看>>
    oracle用户改名
    查看>>
    oracle用户解压不了,PLSQL developer 连接不上64位Oracle 的解决方法
    查看>>
    oracle用户解锁
    查看>>
    Oracle用游标删除重复数据
    查看>>
    Tomcat学习总结(19)—— 为什么首选Tomcat作为JavaWeb应用服务器?
    查看>>
    oracle的内置函数
    查看>>
    Oracle的存储结构
    查看>>
    Oracle的聚合函数group by结合CUBE和ROLLUP的使用
    查看>>
    Oracle监听配置、数据库实例配置等
    查看>>