数据结构(一)顺序表、链表以及队列

2023-11-16

一、顺序表
顺序表:它具有连续内存地址。访问方便O(1),但是删除和插入不方便O(N)。常用数组实现。
在JAVA中,声明一个数组直接使用语句:int[] array = new int[k];k为已知的数组大小。
当然JAVA中本身自带了很多封装的数组,如Arrays,ArrayList,Stack等。

import java.util.Arrays;

/**数组的基本操作,包括插入,删除等,以整数数组为例进行操作
 * 
 * @author wenbaoli
 * @version 1.0
 */
public class Array {

    /** 数组插入元素
     * @param arr 数组
     * @param k 插入的位置
     * @param x 插入的元素
     * @return 返回插入元素后的数组
     */
    public static int[] Insert(int[] arr,int k,int x){
        if(k > arr.length || k < 0){
            System.out.println("插入的位置非法!");
            return null;
        }
        int[] temp = new int[arr.length+1];
        for(int i = 0;i< k; i++){
            temp[i] = arr[i];
        }
        temp[k] = x;
        for(int i = k+1 ;i<temp.length;i++){
            temp[i] = arr[i-1];
        }
        arr = temp;//这里即使改变arr,在main函数中也无法得到改变后的数组,因为方法传递的是arr的拷贝,而不是真正意义上的arr
        return temp;
    }
    /**删除数组中指定位置的元素
     * @param arr 数组
     * @param k 指定的位置
     * @return 返回删除元素后的数组
     */
    public static int[] Delete(int[] arr,int k){
        int[] temp = new int[arr.length - 1];
        for(int i = 0; i < k; i++){
            temp[i] = arr[i];
        }
        for(int i = k+1; i < arr.length; i++){
            temp[i - 1] = arr[i];
        }
        return temp;
    }

    public static void print(int[] arr){
        for(int n : arr){
            System.out.print(n + "\t");
        }
        System.out.println();
    }
    /** 对本类中的方法进行测试
     * 
     * @param arg
     */
    public static void main(String[] arg){

        //initial       
        int[] arr = {1,2,3,4,5,6,7,8,9,0};
        print(arr);
        int[] temp;

        //insert operation
        temp = Insert(arr,5,11);
        arr = temp;//在main函数中改变arr首地址的话是可以得到改变后的数组的。
        print(arr);//此时的arr就是改变后的数组temp


        //delete operation
        temp = Delete(arr,5);
        arr = temp;
        print(arr);

        //other operation using JAVA package
        Arrays.sort(arr);//利用java包Array,对数组进行排序
        print(arr);

    }
}

这里给出了简单的数组的插入与删除。

当然对于数组类Arrays,它本身也有很多方便的方法,如:

Arrays.sort(arr);
Arrays.binarySearch(arr,key);
Arrays.fill(arr,x);

以及栈类Stack
栈的特点是:只能在表的一端进行插入与删除操作,先进后出LIFO。它有两个基本操作:出栈和入栈
使用顺序表stack与栈顶指针top来实现栈

//这个操作一般是C/c++语言操作
stack[top++] = item;//入栈
item = stack[--top];//出栈

需要注意的是:插入的时候需要判断栈是否已满,而删除的时候要判断栈是否为空。常用来设计如下题型:
判断字符串的括号匹配

JAVA中的栈则如下:

import java.util.Stack;

/**对JAVA中自带栈的测试,分别对其各个函数进行了了解与说明。这里的栈更像是一个数组,可以插入与删除(这不是栈的本来定义)。只能出栈与入栈(在一端)才是栈的特点。
 * 
 * @author wenbaoli
 *
 */
public class StackTest {

    public static void main(String[] args){
        Stack<Integer> stack = new Stack<Integer>();

        for(int i = 0; i < 10;i++){
            stack.add(i);
        }
        System.out.println(stack);
        System.out.println(stack.peek());//peek()函数只定位到栈顶的值,并不会出栈
        System.out.println(stack);//此时栈还是原来的
        System.out.println(stack.pop());//pop()函数会出栈。
        System.out.println(stack);//此时栈已经改变(栈顶元素已经出栈了)


        stack.add(3, 10);//在索引为3的位置插入元素10.
        System.out.println(stack);

        stack.remove(3);//去除索引为3的元素
        System.out.println(stack);


        stack.push(9);//将元素9入栈。
        System.out.println(stack);

        stack.addElement(10);//此函数相当于入栈
        System.out.println(stack);

        System.out.println(stack.capacity());//当前栈的容量(这个值可能大于已有的元素个数)

        System.out.println(stack.contains(11));//判断是否含有指定元素,返回false or true

        System.out.println(stack.empty());//判空函数,返回false or true

        System.out.println(stack.search(5));//返回元素5所在的索引值

        System.out.println(stack.capacity());
        stack.trimToSize();//将栈的容量改为当前元素所占用的量
        System.out.println(stack.capacity());//此时的容量即为元素个数
        System.out.println(stack.size());
    }
}

以及ArrayList, Set ,Map 等Collection类。大部分都有类似的方法。但是它们每种都有自己的特点。详情见:http://blog.csdn.net/lilianforever/article/details/46739495

二、链表
相对于顺序表的定位快,插入删除慢,链表则不同,它通过指针将不同位置的元素链接起来,因而优缺点与数组正好相反:定位慢(O(n)),插入删除快(O(1))。链表一般用指针动态分配内存来实现。

在JAVA中有常见的集合类 LinkedList(它的实现采用的是链表机制)。使用之前要先导入包:

import java.util.LinkedList;

声明链表如下:

LinkedList<Integer> llist = new LinkedList<Integer>();

这里的Integer可以换成其他的对象。如String,Double,以及自定义类。

LinkedList的方法也不外乎有:插入,删除,判空,size(),判断是否含有某对象等等。这里不在一一叙述。

除此之外:也可以自定义链表,如:
首先定义一个链表的结点类

public class SingleLinkList{
    int data;
    SingleLinkList next;
}

其次声明链表其实就是已知一个头结点即可。

SingleLinkList h;

当然对于链表还需要一个一个构建,将各个链表结点链接起来。

同理,还可以定义双向链表

public class DoubleLinkList{
    int data;
    DoubleLinkList prior;
    DoubleLinkList next;
}

三、队列
队列是这样一种表:只能在一端(队尾)插入,另一端(对头)删除。

队列的实现:一般用顺序表queue,队首指针front和队尾指针rear来实现队列。它有两个基本操作:入队(enqueue),出队(dequeue)

queue[++rear] = item;//入队
queue[++front] = item;//出队

即不移动元素而是移动指针。这样操作很快,但是表前面的位置是浪费的。
因此有一种特殊的队列是:循环队列,可以避免这种浪费。首先规定一个队列长度size,入队和出队因此变为:

//入队
rear = (rear + 1) % size;
queue[rear] = item;
//出队
front = (front + 1) % size;
queue[front] = item;

JAVA中队列的实现:优先队列(说到底也是一种Collection)
首先引入包

import java.util.PriorityQueue;

声明优先队列,以及一些方法。

PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
pq.add(3);
System.out.println(pq);
pq.peek();
pq.poll();

在这种队列中,入队的顺序是无关的,每次都选一个优先级最小的元素出队。

转载于:https://www.cnblogs.com/wenbaoli/p/5655741.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构(一)顺序表、链表以及队列 的相关文章

随机推荐

  • Python-字典:键值对的魔法世界

    深入理解Python字典 键值对的魔法世界 在Python中 字典 Dictionary 是一种强大且常用的数据结构 它允许我们存储和组织键值对 Key Value 数据 与列表和元组不同 字典中的数据是无序的 但每个数据都与一个唯一的键相
  • Sentinel 流量控制

    上篇 Nacos 配置中心 目录 Sentinel 介绍 官方介绍 https sentinelguard io zh cn docs introduction html Sentinel 部署 服务改造 Sentinel 关键概念 流控规
  • Java 父类 xx = new 子类()

    在java中我们经常遇到父类 xx new 子类 的定义对象 那么与子类 xx new 子类 相比有什么区别呢 下面我们从代码分析 package com sky java public class FatherNewSon param a
  • Rust-Rocket框架笔记

    Rust Rocket框架笔记 Rocket Learn doc Rocket Addr 视频地址 What is Rocket QuickStart 下载Rocket Rust 运行Rust Rocket Hello 错误 端口占用 解决
  • linux下的信号是怎么回事

    信号的产生 Linux下信号这个概念可以来说是非常重要的 先来说下如何产生信号 然后在逐一解释 键盘组合键 硬件异常错误 通过一些指令 软件条件 调用系统函数 1 键盘组合键这个很好理解 下面以一个简单的实例来说明 include
  • 淘宝的架构师,曾宪杰先生主讲的淘宝网架构分享总结【淘宝目前的架构方向】...

    关于什么是stateless的扫盲 见这个贴 http kyfxbl iteye com blog 1831869 一般有一个共识 就是把应用做成无状态的 会比较容易实现水平伸缩 但是以前一直有一个想法 就算应用是有状态的 也可以做成水平伸
  • InputStream 、 InputStreamReader 、 BufferedReader区别

    区别介绍 1 InputStream OutputStream 处理字节流的抽象类 InputStream 是字节输入流的所有类的超类 一般我们使用它的子类 如FileInputStream等 OutputStream是字节输出流的所有类的
  • 云计算的三种模式IaaS/PaaS/SaaS/BaaS对比:SaaS架构设计分析

    SaaS 软件即服务 Software as a Service 的出现改变了传统使用软件转变为使用服务 SaaS与传统软件的最大区别是 前者按年付费租用服务 后者一次买断 这貌似只是 报价方式 的区别 实际上这是一个根本性的变化 这带来的
  • Pygame - 背景图片连续滚动

    方法 让背景图像分别在 0 0 和 0 img heigh 两个位置向下移动它们 当其中一个位于 0 img heigth 位置时 再次将其放置在 0 img heigh 位置 具体代码 import pygame import sys i
  • vue跳转微信小程序遇到的坑

    官方参考https developers weixin qq com doc offiaccount OA Web Apps Wechat Open Tag html 21 vue项目 h5跳转小程序 简书 遇到的问题 在PC端不显示样式
  • 力扣(LeetCode)算法_C++——最大连续 1 的个数 III

    给定一个二进制数组 nums 和一个整数 k 如果可以翻转最多 k 个 0 则返回 数组中连续 1 的最大个数 示例 1 输入 nums 1 1 1 0 0 0 1 1 1 1 0 K 2 输出 6 解释 1 1 1 0 0 1 1 1 1
  • PSA wiring diagram for jumper/relay 2.2hdi

    Anyone has 2007 Citroen Relay 2 2 HDI 88 KW 4HU engine and need an engine and abs wiring diagrams ECU Vistion DCU 102 Ju
  • c#线程三

    1 单元模式和Windows Forms 单元模式线程是一个自动线程安全机制 非常贴近于COM Microsoft的遗留下的组件对象模型 尽管 NET最大地放弃摆脱了遗留下的模型 但很多时候它也会突然出现 这是因为有必要与旧的API 进行通
  • 使用FPGA进行加速运算

    注 本篇文章来源于知乎 为微软亚洲研究院李博杰的回答 详细链接在这儿 点击打开链接 在这篇文章中 作者从CPU GPU FPGA的架构出发 讨论了微软数据中心为什么使用FPGA而不选择GPU 该文章是我逐字搬运过来的 其目的是为后续我们公司
  • XView小程序开源组件库

    XView小程序开源组件库 XView小程序组件库本着简单易用的原则封装组件 使用时只需要在json配置文件中引用即可 使用 组件库当中大致可分为一下三大类 布局组件 基础组件 表单组件 XView小程序组件库本着简单易用的原则封装组件 使
  • UI自动化概念 + Web自动化测试框架介绍

    1 UI自动化测试概念 我们先明确什么是UI UI 即 User Interface简称UI用户界面 是系统和用户之间进行交互和信息交换的媒介 UI自动化测试 Web自动化测试和移动自动化测试都属于UI自动化测试 UI自动化测试就是借助自动
  • tf2使用tensorboard(jupyter notebook)

    环境 tensorflow2 0 jupyter notebook unbuntu18 04 这个应该影响不大 示例 用的是iris数据集分类 该数据集库自带 import tensorflow as tf import numpy as
  • Catalan卡塔兰数

    今天在二叉搜索树 随机组成情况 分析复杂度遇到 catalan数 学习并记录一下 背景 分析二叉搜索树 BST 的平均性能时 我们可以分为随机生成和随机组成分析 随机生成 将各节点按照数的顺序随机排列 若含有n个节点 n个互异关键码 则有n
  • 波士顿动力开源代码_失去动力两年后,我如何开始开源之旅

    波士顿动力开源代码 by Hemakshi Sachdev 通过Hemakshi Sachdev 失去动力两年后 我如何开始开源之旅 How I started my open source journey after being demo
  • 数据结构(一)顺序表、链表以及队列

    一 顺序表 顺序表 它具有连续内存地址 访问方便O 1 但是删除和插入不方便O N 常用数组实现 在JAVA中 声明一个数组直接使用语句 int array new int k k为已知的数组大小 当然JAVA中本身自带了很多封装的数组 如