当前位置: 首页 > article >正文

LeetCode 225: 用队列实现栈

题目:
在这里插入图片描述
在这里插入图片描述
题解:
在这里插入图片描述

代码示例:

package com.zy.leetcode.LeetCode_225;

import com.zy.queue_code.demo04.ArrayQueue3;

/**
 * @Author: zy
 * @Date: 2025-01-10-10:26
 * @Description:
 */
public class LeetCode_225 {

    ArrayQueue3<Integer> queue = new ArrayQueue3<>(100);

    private int size = 0;

    public void push(int x) {
        queue.offer(x);
        for (int i = 0; i < size; i++) {
            queue.offer(queue.poll());
        }
        size++;

    }

    public int pop() {
        size--;
        return queue.poll();

    }

    public int top() {
        return queue.peek();

    }

    public boolean empty() {
        return size == 0;
    }

    public static void main(String[] args) {

        LeetCode_225 leetCode_225 = new LeetCode_225();
        leetCode_225.push(1);
        leetCode_225.push(2);
        System.out.println(leetCode_225.top()); // 2

        System.out.println(leetCode_225.pop()); // 2
        System.out.println(leetCode_225.empty()); // false
        leetCode_225.push(3);
        System.out.println(leetCode_225.top()); // 3

        System.out.println(leetCode_225.pop()); // 3

        System.out.println(leetCode_225.empty()); // false

    }
}

package com.zy.queue_code.demo04;

import com.zy.queue_code.demo01.Queue;
import org.jetbrains.annotations.NotNull;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * @Author: zy
 * @Date: 2025-01-07-12:23
 * @Description: 求模运算:
 * - 如果除数是2的n次方
 * - 那么被除数的后n 位即为余数(模)
 * 求被除数的后n 位方法:与 2^n-1 按位与
 */
public class ArrayQueue3<E> implements Queue<E>, Iterable<E> {

    private final E[] array;

    public int head = 0;

    public int tail = 0;

    /**
     * 如果除数是2的n次方
     *
     * // 求离C最近,比C大的 2^n(方法2)
     * C-=1;
     * c |=c>>1;
     * c | =c>>2;
     * c | =c>>4;
     * с | =с>>8;
     * с | =с>>16;
     * C+=1;
     * System.out.println(c);
     * I
     *
     * @param capacity
     */
    public ArrayQueue3(int capacity) {
        //1.抛异常
        //        int num = capacity & (capacity - 1);
        //        if (num != 0) {
        //            throw new IllegalArgumentException("capacity must be a power of 2");
        //        }
        //2.将传入的数据改成一个接近2^n 的数字
        int n = (int) (Math.log(capacity - 1) / Math.log(2)) + 1;
        /**
         * 1     2^0
         * 10    2^1
         * 100   2^2
         * 1000  2^3
         * 10000 2^4
         *
         * 左移
         */
        int capacity2 = 1 << n;
        //3. 创建一个接近2^n 的数组
        array = (E[]) new Object[capacity2];
    }

    @Override
    public boolean offer(E value) {
        //判断是否已经满了?
        if (isFull()) {
            return false;
        }
        //array[(int) (Integer.toUnsignedLong(tail) % array.length)] = value;
        array[tail & (array.length - 1)] = value;
        tail++;
        return true;
    }

    @Override
    public E poll() {
        if (isEmpty()) {
            return null;
        }
        //        E value = array[(int) (Integer.toUnsignedLong(head) % array.length)];
        E value = array[head & (array.length - 1)];
        head++;
        return value;
    }

    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        return array[((head) & (array.length - 1))];
    }

    @Override
    public boolean isEmpty() {
        return head == tail;
    }

    @Override
    public boolean isFull() {
        //return (tail + 1) % array.length == head;
        //tail -array.length == head
        //return (tail - head + array.length) % array.length == 0;
        return tail - array.length == head;
    }

    @NotNull
    @Override
    public Iterator<E> iterator() {
        return new Iterator<>() {
            int p = head;

            @Override
            public boolean hasNext() {
                return p != tail;
            }

            @Override
            public E next() {
                if (!hasNext()) {
                    throw new NoSuchElementException();
                }
                E value = array[p & (array.length - 1)];
                //p = (p + 1) % array.length;
                p++;
                return value;
            }
        };
    }
}


http://www.kler.cn/a/501264.html

相关文章:

  • 回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测
  • Bash语言的语法糖
  • Copula算法原理和R语言股市收益率相依性可视化分析
  • 25年无人机行业资讯 | 1.1 - 1.5
  • 【Python】Python与C的区别
  • 软件系统安全逆向分析-混淆对抗
  • 每日学习30分轻松掌握CursorAI:多文件编辑与Composer功能
  • OpenGL利用DDA算法绘制图形,并增加鼠标键盘交互
  • VUE3 监听器(watch)
  • 卷积神经网络:过滤器为啥被叫作“核”
  • 内网服务器添加共享文件夹功能并设置端口映射
  • 【YOLOv5】源码(train.py)
  • 红队攻防 | 凭证获取的10个方法
  • 云计算-操作系统介绍
  • 我这不需要保留本地修改, 只需要拉取远程更改
  • Vue2: el-table为每一行添加超链接,并实现光标移至文字上时改变形状
  • 如何快速准备数学建模?
  • 代码随想录day13| 二叉树理论基础| 递归遍历|迭代遍历| 统一迭代 |层序遍历
  • 第25章 汇编语言--- 信号量与互斥锁
  • 什么是数据分析?
  • asp.net core webapi 并发请求时 怎么保证实时获取的用户信息是此次请求的?
  • 【网络安全 | 漏洞挖掘】通过监控调试模式实现价值$15k的RCE
  • 基于单片机的粮仓环境监测系统设计
  • 第32天:Web开发-PHP应用文件操作安全上传下载任意读取删除目录遍历文件包含
  • SpringCloud:gateway分发服务报302,Network Error
  • Rabbit Rocket kafka 怎么实现消息有序消费和延迟消费的