LeetCode | 232 Implement Queue Using Stacks

分析

peek:In computer science, peek is an operation on certain abstract data types, specifically sequential collections such as stacks and queues, which returns the value of the top("front") of the collection without removing the element from the collection. It thus returns the same value as operations such as "pop" or "dequeue", but does not modify the data.

队列是"管道",栈是"杯子",用栈来模拟队列,就像两次倒水过程,两次镜像反射。StackIn栈可以视为中间缓存。

  -----------------------
  Queue 队列  >>>>>>>>>>>
  -----------------------
                         ⇓
  -----------------------
  | StackIn栈 <<<<<<<<<<<
  -----------------------
 ⇓
  -----------------------
    StackOut栈 <<<<<<<<< |
  -----------------------

缓存概念

  • StackIn: 作为缓存区,存储着待处理的元素
  • StackOut:作为输出栈,它负责提供队列头部的元素

同步异步操作

  • 当StackOut中已有数据时,出队操作是异步的,可以立即执行,StackIn依旧可以执行它的入栈操作
  • 当StackIn为空时,出队操作是同步的,需要等待stackIn中的所有元素转移至stackOut才能进行后续操作

判空状态

  • 双栈均为空才能算真正的空

衍生思考
在进行大批量的字符串反转,倘若我使用之前学过的双指针或for循环的方式,前者直接修改了原始数据,后者需要确定字符串的原始规模,循环代价特别大。

HelloWorld  NiHaoNeking
一次处理10个字符:先对10个字符内部进行倒叙,再用Stack进行弹出
dlroWolleH gnikeNoaHiN

gnikeNoaHiN dlroWolleH

HelloWorld
一次处理3个字符
Hel loW orl  d
leH Wol lro  d

d lro Wol leH 

这个部分我有点思考过多,需要给自己按下一个暂停键,后面再去继续深入这个大批量字符串如何分批倒转实现整体倒转

主类

public class MyQueue {

    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn  = new Stack<>();
        stackOut = new Stack<>();
    }

    public void push(int x) {
        stackIn.push(x);
    }

    public int pop() {
        dumpStackIn();
        return stackOut.pop();
    }

    public int peek() {
        dumpStackIn();
        return stackOut.peek();
    }

    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    private void dumpStackIn() {
        /**
         * 在StackOut不为空的情况,执行异步操作
         */
        if (!stackOut.isEmpty()) {
            return;
        }

        /**
         * 在StackOut为空的情况下,执行同步操作,把缓存StackIn的元素全部取出
         */
        while (!stackIn.isEmpty()) {
            stackOut.push(stackIn.pop());
        }
    }
}

posted @ 2024-08-10 11:22  Neking  阅读(3)  评论(0编辑  收藏  举报