西维蜀黍

【Data Structure】栈(Stack)

栈(Stack)

栈(Stack),是一种有序特殊的线性表,只允许在有序的线性数据集合的一端(称为堆栈顶端,top)进行加入(push)数据和移除(pop)数据的运算。因而按照**后进先出(LIFO, Last In First Out)**的原理运作。

栈的基本操作创建栈,判空,入栈,出栈,获取栈顶元素等,注意栈不支持对指定位置进行删除,插入。

其实非常好理解,我们将栈可以看成一个箱子

  • 往箱子里面放东西叫做入栈(push);
  • 往箱子里面取东西叫做出栈(pop);
  • 箱子的底部叫做栈底(bottom);
  • 箱子的顶部叫做栈顶(top)。

说到栈的特性,肯定会有一句经典的言语来概括:先进后出(LIFO, Last In First Out)

Stack这种数据结构用途很广泛,在计算机的使用中,大量的运用了栈,比如编译器中的词法分析器、Java虚拟机、软件中的撤销操作(Undo)、浏览器中的回退操作,编译器中的函数调用实现等等。

  ...


【Java】运算符-位运算符

基础

我们已经知道计算机中,所有数据最终都是使用二进制数表达。

比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:00000000 00000000 00000000 00000101 5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。 现在想知道,-5在计算机中如何表示?

在计算机中,负数以其正值的补码形式表达

  ...


【Data Structure】链表 - 循环链表(Circular Linked List)

循环链表(Circular Linked List)

双链表就是在单链表结点上增添了一个指针域,指向当前结点的前驱。这样就可以方便的由其后继来找到其前驱,而实现输出终端结点到开始结点的数据序列。

同样,双链表也分为带头结点的双链表和不带头结点的双链表,情况类似于单链表。带头结点的双链表 head->next 为null的时候链表为空。不带头结点的双链表head为null的时候链表为空。

  ...


【Data Structure】链表 - 双向链表(Doubly Linked List)

双向链表(Doubly Linked List)

从名字上理解双向链表(Doubly Linked List),即链表是 “双向” 的,如下图所示:

  ...


【Java】集合类 - List - LinkedList

LinkedList

LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同。LinkedList 是基于链表实现的(通过名字也能区分开来),所以它的插入和删除操作比 ArrayList 更加高效。但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差。

  ...


【Data Structure】链表(Linked List)

链表(Linked List)

链表(Linked List),别名链式存储结构或单链表,用于存储逻辑关系为 “一对一” 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。

例如,使用链表存储 {1,2,3},数据的物理存储状态如下图所示:

我们看到,上图根本无法体现出各数据之间的逻辑关系。对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素。如下图所示:

像上图这样,数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。

也就是说:链表具有动态的能力,不需要去处理固定容量的问题

正因为链表具备这种动态能力,那它也就缺失了**高效的random access(随机访问)**的能力。它无法与数组一样,通过一个索引(index)直接获取对应的元素。

因为在底层机制中数组开辟的空间在内存中是连续分布的,我们可以直接寻找索引对应的偏移,直接计算出数据所存储的内存地址,直接用O(1)复杂度拿出。

链表靠next连接,每个节点存储地址不同,我们只能通过next顺藤摸瓜找到我们要找的元素。

  ...


【Java】集合类 - ArrayList

ArrayList介绍

ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组。与Java中的数组相比,它的容量能动态增长。类似于C语言中的动态申请内存,动态增长内存。

当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变。ArrayList在保留数组可以快速查找优势的基础上,还解决了自动扩容问题。

  ...


【Data Structure】数组(Array)

数组(Array)

数组(Array),是线性表一种实现方式,用于存储逻辑关系为“一对一”的数据。

数组存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。

  ...


【Algorithm】什么是算法(Algorithm)

算法(Algorithm)

**算法(Algorithm)**是解决特定问题求解步骤的的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

对于给定的问题,是可以有多种算法来解决的。

  ...


【Data Structure】什么是数据结构

什么是数据结构

数据(Data):从计算机的角度来看,数据是所有能被输入到计算机中且能被计算机处理的符号的集合。它是计算机操作的对象的总称,也是计算机处理信息的某种特定的符号表示形式(二进制码的抽象表示?)。

数据对象:数据对象是性质相同的数据元素的集合,是数据的子集。 什么叫性质相同呢,是指数据元素具有相同数量和类型的数据项,比如,人都有姓名、生日、性别等相同的数据项。

数据元素(Data Element):数据元素是数据中的一个个体,是数据的基本单位,在计算机中通常作为一个整体来进行考虑和处理。

数据项(Data Object):一个数据元素可以由多个数据项组成。数据项是具有独立含义的数据最小单位。

  ...