数据结构—栈、队列、链表

news2024/11/20 16:36:19

一、栈 Stack(存取O(1))

先进后出,进去123,出来321。
基于数组:最后一位为栈尾,用于取操作。
基于链表:第一位为栈尾,用于取操作。

1.1、数组栈 

/**
 * 基于数组实现的顺序栈; items[0]:表头/栈底;  items[size-1]:表尾/栈顶;
 */
public class MyArrayStack {
    // 存储元素的 数组
    private String items[];
    // 栈实际大小
    private int size =0;
    // 栈的容量
    private int capacity = 0;

    public MyArrayStack(int capacity) {
        this.size = 0;
        this.capacity = capacity;
        this.items = new String[capacity];
    }

    /**
     * 入栈
     */
    public boolean push(String item) {
        if(size >= capacity){
            throw new IndexOutOfBoundsException("MyArrayStack 栈的内存满了");
        }
        items[size] = item;
        size++;
        return true;
    }

    /**
     * 出栈
     */
    public String pop() {
        if(size<=0){
            throw new IndexOutOfBoundsException("MyArrayStack 栈的内存空了");
        }
        String item = items[size-1];
        items[size-1] = null;
        size--;
        return item;
    }
}

1.2、链表栈 

/**
 * 基于链表实现的链式栈  top: 表尾/栈顶;
 */
public class MyLinkedStack {

    // 表尾/栈顶;
    private Node top = null;

    /**
     * 入栈
     */
    public void push(String value) {
        Node node = new Node(value,null);
        if(top != null){
            node.nextNode = top;
        }
        top = node;
    }

    /**
     * 出栈
     */
    public String pop() {
        if(top==null){
            throw new IndexOutOfBoundsException("MyLinkedStack 栈的内存空了");
        }
        String retValue = top.getValue();
        top = top.nextNode;
        return retValue;
    }

    /**
     * 节点
     */
    private static class Node{
        // 存储数据
        private String value;
        // 下个节点
        private Node nextNode;
        public Node(String value, Node nextNode) {
            this.value = value;
            this.nextNode = nextNode;
        }
        public String getValue() {
            return value;
        }
    }
}

二、队列 Queue (存取O(1))

先进先出(FIFO)的有序列表 

2.1、数组单向队列 (存取O(1))

/**
 * 基于数组实现的顺序队列
 */
public class MyArrayQueue {

    private String [] items;

    // 容量
    private int capacity = 0;

    // 队头下标
    private int head = 0;

    // 队尾下标
    private int tail = 0;

    public MyArrayQueue(int capacity) {
        this.items = new String [capacity];
        this.capacity = capacity;
    }

    /**
     * 入队
     */
    public boolean enqueue(String item) {
        if(capacity == tail){
            throw new IndexOutOfBoundsException("MyArrayQueue 容量满了");
        }
        items[tail] = item;
        tail++;
        return true;
    }

    /**
     * 出队
     */
    public String dequeue() {
        if(head==tail){
            throw new IndexOutOfBoundsException("MyArrayQueue 容量空了");
        }
        String retValue = items[head];
        head++;
        return retValue;
    }
}

2.2、链表单向队列 

/**
 * 基于链表实现的链式队列
 */
public class MyLinkedListQueue {
    // 队头
    private Node head = null;
    // 队尾
    private Node tail = null;

    /**
     * 入队
     */
    public void enqueue(String value) {
        Node node = new Node(value,null);
        if(tail==null){
            head = node;
            tail = node;
        }else {
            tail.next=node;
            tail=node;
        }
    }

    /**
     * 出队
     */
    public String dequeue() {
        if(head==null){
            throw new IndexOutOfBoundsException("MyLinkedListQueue 队列空了");
        }
        String retValue = head.getValue();
        head = head.next;
        if (head == null) {
            tail = null;
        }
        return retValue;
    }

    private static class Node{
        private String value;
        private Node next;
        public Node(String value, Node next) {
            this.value = value;
            this.next = next;
        }
        public String getValue() {
            return value;
        }
    }
}

三、链表 LinkedList 

3.1、单向链表 

/**
 * 单向普通链表
 */
public class MyLinkedList {
    // 链表大小
    private int size;
    // 表头
    private Node head;

    /**
     * 插入
     */
    public void insert(int index, String value) {
        if(index<0){
            throw new IndexOutOfBoundsException("MyLinkedList 下标越界了");
        } else {
            if(head==null){
                head = new Node(value,null);
            }else {
                if(index>=size){
                    index = size-1;
                }
                Node prev = head;
                for(int i=0;i<index;i++){
                    prev = prev.next;
                }
                Node node = new Node(value,prev);
                prev.next =node;
            }
            size++;
        }
    }

    /**
     * 获取
     */
    public String get(int index){
        if(size<=0){
            throw new IllegalArgumentException("MyLinkedList 空链表");
        }
        if(index<0 || index>=size) {
            throw new IllegalArgumentException("MyLinkedList 下标越界了");
        }
        Node prev = head;
        for (int i=0;i<index;i++){
            prev = prev.next;
        }
        return prev.getValue();
    }

    private class Node{
        private String value;
        private Node next;
        public Node(String value, Node next) {
            this.value = value;
            this.next = next;
        }
        public String getValue() {
            return value;
        }
    }
}

3.2、双向链表 


public class MyDoubleLinkedList {
    // 链表大小
    private int size;
    // 表头
    private Node head;
    // 表尾
    private Node tail;

    /**
     * 插入
     */
    public void insert(int index,String data) {
        if(index < 0) {
            throw new IndexOutOfBoundsException("MyDoubleLinkedList  insert 下标越界");
        }
        Node node = new Node(data,null,null);
        if(index == 0) {
            head.next = node.next;
            head= node;
            return;
        }
        if(index >= size) {
            tail.prev = node.prev;
            tail= node;
            return;
        }
        Node cur = this.head;
        while(index != 0) {
            cur = cur.next;
            index--;
        }
        node.next = cur;
        cur.prev.next = node;
        node.prev = cur.prev;
        cur.prev = node;
    }

    public String get(int index){
        if(index<0||index>size){
            throw new IndexOutOfBoundsException("MyDoubleLinkedList get 下标越界了");
        }
        if(index<=(size/2)){
            Node cur = head;
            for(int i = 0;i<index-1;i++){
               cur = head.next;
            }
            return cur.getValue();
        }else {
            index = size-index;
            Node cur = tail;
            for (int i=size;i>index;i--){
                cur = cur.prev;
            }
            return cur.getValue();
        }
    }


    private class Node{
        public String value;
        public Node prev;
        public Node next;
        public Node(String value, Node prev, Node next) {
            this.value = value;
            this.prev = prev;
            this.next = next;
        }

        public String getValue() {
            return value;
        }
    }
}

3.3、跳表 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1059029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4 Ways to Fix an Operation Did Not Complete Virus Error on Windows

文章目录 Can’t open a file on your PC? Use these methods to fix your issue. A Windows operation did not complete virus error.Mahesh Makvana / How-To Geek Readers like you help support How-To Geek. When you make a purchase using links on our site, we ma…

Spring实例化源码解析之registerBeanPostProcessors(六)

BeanPostProcessors是Spring框架中的一个扩展机制&#xff0c;它允许开发人员在Spring容器实例化、配置和初始化Bean的过程中干预和定制化。BeanPostProcessor接口定义了两个方法&#xff1a;postProcessBeforeInitialization和postProcessAfterInitialization&#xff0c;分别…

【WSN】无线传感器网络 X-Y 坐标到图形视图和位字符串前缀嵌入方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MacOS - Sonoma更新了啥

1 系统介绍 苹果公司于2023年9月26日发布了macOS Sonoma 14.0正式版。名称由来不知道&#xff0c;可能是地名&#xff1a;Sonoma是一个地名,指加利福尼亚州北部索诺玛县(Sonoma County)。 2 系统重要更新 2.1 将小组件添加到桌面 速览提醒事项和临近日程等。按住Control键点…

(一) 使用 Hugo 搭建个人博客保姆级教程(上篇)

手把手教你如何从0开始构建一个静态网站&#xff0c;这不需要有太多的编程和开发经验和时间投入&#xff0c;也基本不需要多少成本&#xff08;除了个性化域名&#xff09;&#xff0c;使用GitHub和Hugo模板即可快速构建和上线一个网站。 目标读者 本文档适用于以下用户&…

学信息系统项目管理师第4版系列16_资源管理过程

1. 组建项目团队&#xff0c;建设项目团队和管理项目团队属于执行过程组 1.1. 【高22上选21】 1.1.1. 【高21上选25】 1.2. 3版 2. 【高19上案三】 2.1. 【高18上案三】 2.2. 【高23上案一】 3. 规划资源管理 3.1. 定义如何估算、获取、管理和利用团队以及实物资源的过…

二叉树的顺序存储——堆——初识堆排序

前面我们学过可以把完全二叉树存入到顺序表中&#xff0c;然后利用完全二叉树的情缘关系&#xff0c;就可以通过数组下标来联系。 但是并不是把二叉树存入到数组中就是堆了&#xff0c;要看原原来的二叉树是否满足&#xff1a;所有的父都小于等于子&#xff0c;或者所有的父都…

十二、【漏洞复现】Rails任意文件读取(CVE-2019-5418)

十二、【漏洞复现】Rails任意文件读取(CVE-2019-5418&#xff09; 12.1、漏洞原理 Ruby on Rails是一个使用 Ruby 语言写的开源 Web 应用框架&#xff0c;它是严格按照 MVC 结构开发的。它努力使自身保持简单&#xff0c;来使实际的应用开发时的代码更少&#xff0c;使用最少…

JavaScript系列从入门到精通系列第十三篇:JavaScript中基本数据类型和引用数据类型,创建对象的两种方式

一&#xff1a;基本数据类型与引用数据类型 基本数据类型&#xff1a;String Number Boolean Null Undefined 引用数据类型&#xff1a;Object 我们的内存分成了两大块&#xff0c;一是栈内存二是堆内存。变量都是保存到栈内存中&#xff0c;var a 123; a和123都在栈空间&…

互联网Java工程师面试题·ZooKeeper 篇·第一弹

目录 1. ZooKeeper 面试题&#xff1f; 2. ZooKeeper 提供了什么&#xff1f; 3. Zookeeper 文件系统 4. ZAB 协议&#xff1f; 5. 四种类型的数据节点 Znode 6. Zookeeper Watcher 机制 -- 数据变更通知 7. 客户端注册 Watcher 实现 8. 服务端处理 Watcher 实现 9. 客…

Redis最常见的5种应用场景

Redis作为当今最流行的内存数据库&#xff0c;已经成为服务端加速的必备工具之一。对于Redis为什么那么快&#xff1f;以及Redis采用单线程&#xff0c;但为什么反而获得更高的性能的疑问&#xff0c;在之前的Redis为什么那么快&#xff1f;一文中&#xff0c;已经有所介绍。 …

TCP端口崩溃,msg:socket(): Too many open files

一、现象 linux系统中运行了一个TCP服务器&#xff0c;该服务器监听的TCP端口为10000。但是长时间运行时发现该端口会崩溃&#xff0c;TCP客户端连接该端口会失败&#xff1a; 可以看到进行三次握手时&#xff0c;TCP客户端向该TCP服务器的10000端口发送了SYN报文&#xff0c;…

Qt 综合练习小项目--反金币(1/2)

目录 1 项目简介 2 项目基本配置 2.1 创建项目 2.2 添加资源 3 主场景 3.1 设置游戏主场景配置 3.2 设置背景图片 3.3 创建开始按钮 3.4 开始按钮跳跃特效实现 3.5 创建选择关卡场景 3.6 点击开始按钮进入选择关卡场景 1 项目简介 翻金币项目是一款经典的益智类游戏…

开发过程教学——交友小程序

交友小程序 1. 我的基本信息2. 我的人脉2.1 我的关注2.2 我的粉丝 3. 我的视频4. 我的相册 特别注意&#xff1a;由于小程序分包限制2M以内&#xff0c;所以要注意图片和视频的处理。 1. 我的基本信息 数据库表&#xff1a; 我的基本信息我的登录退出记录我的登录状态&#x…

roarctf_2019_easy_pwn

roarctf_2019_easy_pwn Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled64位&#xff0c;保护全开 __int64 ADD() {__int64 result; // raxint i; // [rsp4h] [rbp-1Ch]int v2; // [rsp8h] [rbp-18h]int…

数学建模Matlab之基础操作

作者由于后续课程也要学习Matlab&#xff0c;并且之前也进行了一些数学建模的练习&#xff08;虽然是论文手&#xff09;&#xff0c;所以花了几天零碎时间学习Matlab的基础操作&#xff0c;特此整理。 基本运算 a55 %加法&#xff0c;同理减法 b2^3 %立方 c5*2 %乘法 x 1; …

93、Redis 之 使用连接池管理Redis6.0以上的连接 及 消息的订阅与发布

★ 使用连接池管理Redis连接 从Redis 6.0开始&#xff0c;Redis可支持使用多线程来接收、处理客户端命令&#xff0c;因此应用程序可使用连接池来管理Redis连接。 上一章讲的是创建单个连接来操作redis数据库&#xff0c;这次使用连接池来操作redis数据库 Lettuce连接池 支持…

Flutter笔记:手写并发布一个人机滑动验证码插件

Flutter笔记 手写一个人机滑块验证码 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133529459 写 Flut…

【深蓝学院】手写VIO第4章--基于滑动窗口算法的 VIO 系统:可观性和 一致性--作业

0. 内容 T1. 参考SLAM14讲P247直接可写&#xff0c;注意 ξ 1 , ξ 2 \xi_1,\xi_2 ξ1​,ξ2​之间有约束&#xff08;关系&#xff09;。 套用舒尔补公式&#xff1a; marg掉 ξ 1 \xi_1 ξ1​之后&#xff0c;信息被传递到 L 1 和 L 2 L_1和L_2 L1​和L2​之间了。 T2. …

同学苹果ios的ipa文件应用企业代签选择签名商看看这篇文章你再去吧

同学我们要知道随着互联网的发展&#xff0c;苹果应用市场的火爆&#xff0c;越来越多的开发者加入到苹果应用开发行业中来。同时&#xff0c;苹果应用市场上的应用也在不断增多&#xff0c;用户数量也在不断增加&#xff0c;苹果应用代签是指通过第三方公司为开发者的应用进行…