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

    你可能感兴趣的文章
    NSJSON的用法(oc系统自带的解析方法)
    查看>>
    nslookup 的基本知识与命令详解
    查看>>
    NSOperation基本操作
    查看>>
    NSRange 范围
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NSURLSession下载和断点续传
    查看>>
    NSUserdefault读书笔记
    查看>>
    NS图绘制工具推荐
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    NT symbols are incorrect, please fix symbols
    查看>>
    ntelliJ IDEA 报错:找不到包或者找不到符号
    查看>>
    NTFS文件权限管理实战
    查看>>
    ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    ntp server 用法小结
    查看>>
    ntpdate 通过外网同步时间
    查看>>
    ntpdate同步配置文件调整详解
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP服务器
    查看>>