算法与数据结构

数据结构与算法之美之栈、队列和递归

穿精又带淫゛_ 提交于 2019-12-22 00:40:18
栈 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈 实现方法: package com.smao.leetcode; /** * 数组式链表 */ public class ArrayStack { private String[] arrayStack; private int size;//栈中元素个数 private int count;//栈的容量 public ArrayStack(int count) { this.arrayStack = new String[count]; this.count = count; this.size = 0; } public boolean push(String item){ if(this.count == this.size){ String[] arrayStackNew = new String[this.count*2]; for(int i=0;i<arrayStack.length;i++){ arrayStackNew[i] = arrayStack[i]; this.count = this.count*2; } this.arrayStack = arrayStackNew; } arrayStack[this.size] = item; this

数据结构基础概念篇

半城伤御伤魂 提交于 2019-12-21 23:46:01
数据结构基础概念篇 原创 小草莓lllll 发布于2017-11-14 13:44:24 阅读数 158267 收藏 更新于2017-11-14 13:44:24 分类专栏: 数据结构与算法 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_31196849/article/details/78529724 展开 <h1 id="数据结构"><a name="t0"></a><a name="t0"></a>数据结构</h1> 一些概念 数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系

基础数据结构

别说谁变了你拦得住时间么 提交于 2019-12-21 23:45:06
java - 数据结构 - 基础数据结构 整理所学,期待批评指教 基础概念 数据 描述客观事物的数值、字符以及能输入到计算机中且能被处理的各种符号集合 数据元素 组成数据的基本单位,数据集合的个体,计算机中通常作为一个整体进行考虑 数据对象 性质相同的数据元素的集合,数据的一个子集 数据结构 相互之间存在一种或多种特定关系的数据元素的集合 是一个二元组: D —>数据有限集 R —>D上关系的有限集 Data_Stracture = (D, R) 数据类型 性质相同的值集合以及定义在这个值集合上的一组操作的总称。 数据抽象与抽象数据类型 抽象数据类型(Abstract Data Type)ADT 含义:数据模型及定义在数据模型上的操作 特征:使用与实现分离,实现信息封装及隐蔽 抽象数据类型实现 1.面向过程设计 逻辑架构—>选定存储结构,操作要求—>设计子程序或子函数 2.“包”,“模型”设计方法 可单独编译,同时提供了外部使用的方便 3.面向对象程序设计(Object Oriented Programming,OOP) 着眼于应用问题涉及的对象,包括对象,对象属性和要求 1.数据结构内容 1.1 数据的逻辑结构 数据逻辑间关系的描述 依据数据间不同关系划分 集合结构:结构中数据元素除同属于一个集合外无任何关系 线性结构:结构中数据元素存在着一对一的线性关系 树型结构

关于为什么要写数据结构与算法。

二次信任 提交于 2019-12-21 04:08:52
最近准备换工作,去了几个面试。 不知道是我去的公司都比较好还是怎么着。都考了数据结构与算法方面的问题。这东西我刚学的时候会,自打工作以后就没用过。 数据结构与算法真的是在我的编程中很少用到,应该是我没干过开发的缘故吧。我干的hadoop又用不到这些。 所以面试的时候被问住了。每次面试前都要重新看,每次都是这样。 面试完以后很郁闷,我工作了1年多了,不会数据结构和算法也照样能搞hadoop啊,照样完成工作啊。 后来想想,这是编程的基础,一定程度上体现程序员的编程水平。 所以决定重新再温习一下数据结构与算法,印象中是第3次了。这次复习完,记一辈子,再也不回头看了!!因为基础的就那么些东西,链表,二叉树,堆栈,排序,查找什么的。 我的方法是从网上下载下来对应C程序,手抄一遍,了解过程。随手也会添加几个我的方法上去。然后再在电脑上敲一边程序。直到闭着眼也能写出程序来。 线性表比较简单,一般不考,主要是二叉树,排序(快速排序),查找。这3部分考的多。我想把主要精力放在这3部分上,其他简单的就写2遍就得了。 真的是好记性不如烂笔头啊!以前看书,学一个小技术,当时总任务记得很清楚,理解的很明白,1个月,3个月,1年以后再清楚也忘记了。 所以说,不要怕浪费时间,一定要手写一下啊!记录一下啊! 来源: https://www.cnblogs.com/duzl/archive/2012/06/29

数据结构与算法(九)链队列——队列的链式存储结构

不问归期 提交于 2019-12-21 03:55:21
链队列 队列的链式存储结构,其实就是线性表的单链表,只不过它只能它只能尾进头出而已,我们把它就称之为链队列。 既然链队列和单链表一样,观察链队列LinkedQueue和单链表LinkedList的UML类图,可以看到两者之间是聚合关系,也就说LinkedQueue相当于LinkedList的成员变量,和我们的之前说的链栈是一样的 既然如此,也是创建LinkedList对象list实现,调用list的方法即可,当然LinkedQueue还有实现Queue接口 package DS02 . 动态链表 ; import DS01 . 动态数组 . Queue ; import java . util . Iterator ; public class LinkedQueue < E > implements Queue < E > { //声明并创建单链表对象 private LinkedList < E > list ; public LinkedQueue ( ) { list = new LinkedList < > ( ) ; } @Override public int getSize ( ) { return list . getSize ( ) ; } @Override public boolean isEmpty ( ) { return list . isEmpty

数据结构错题汇总

纵然是瞬间 提交于 2019-12-20 23:48:50
第一章: (3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着( )。 A.数据具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 答案:B (6)以下数据结构中,( )是非线性数据结构 A.树 B.字符串 C.队列 D.栈 答案:A 第二章: (2)在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是( )。 A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) B.在第i个结点后插入一个新结点(1≤i≤n) C.删除第i个结点(1≤i≤n) D.将n个结点从小到大排序 答案:A 解释:在顺序表中插入一个结点的时间复杂度都是O(n2),排序的时间复杂度为O(n2)或O(nlog2n)。顺序表是一种随机存取结构,访问第i个结点和求第i个结点的直接前驱都可以直接通过数组的下标直接定位,时间复杂度是O(1)。 (5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( )。 A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续或不连续都可以 答案:D (8)将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是( )。 A.n B.2n-1 C.2n D.n-1 答案:A 解释:当第一个有序表中所有的元素都小于(或大于

数据结构和算法排序之基数排序

痴心易碎 提交于 2019-12-20 15:01:14
基数排序: 基本思想: 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 package Sort ; import java . util . Arrays ; //基数排序,这段代码只适用于元素都为整数的数组排序,若有负数会出现数组越界异常,我在不含有负数数组的基数排序代码上进行了改进,因此这段代码也适用于含有负数的数组进行基数排序 /* * 如要实现含有负数的基数排序 * 基本思想: * 1.将原始数组分割为两个模块,一个模块都是负数,一个模块都是正数。将负数模块全部转为正数,两个模块分别进行基数排序 *2.将基数排序后的负数数组(之前先进行了转正),转为负数,然后使用Arrays.sort()按顺序排列; * 3.两个数组进行合并 * */ public class RadixSort { public static void main ( String [ ] args ) { int [ ] arr = { - 53 , 3 , 542 , 748 , 14 , - 214 } ; //如果数组中含有负数,那么就分割,正数放在一个数组,负数放在一个数组 //1.提取负数 int count = 0 ; //记录负数个数 for ( int i = 0 ;

数据结构与算法(八)链栈——栈的链式存储结构

巧了我就是萌 提交于 2019-12-20 10:26:57
链栈 栈的链式存储结构简称链栈,对链栈来说基本不存在栈满的情况,除非内存已经没有可以使用的空间 链栈其实也是线性表的单链表,只不过它是只能栈顶进出元素(线性表的表尾),我们看一下单链表和链栈的UML类图,LinkedList与LinkedStack是聚合关系,聚合关系是关联的一种形式,代表两个类之间的整体/局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。聚合也转换成Java中的一个实例作用域变量。 也就是说LinkedStack是LinkedList的一个成员变量,既然如此,可以在链栈创建LinkedList对象list,实现LinkedStack调用list的方法即可,当然LinkedStack还有实现Stack接口,具体代码如下: package DS02 . 动态链表 ; import DS01 . 动态数组 . Stack ; import java . util . Iterator ; public class LinkedStack < E > implements Stack < E > { //创建LinkedList对象 private LinkedList < E > list ; //获取有效元素个数 @Override public int getSize ( ) { return list .

数据结构与算法--Python栈 栈实现综合计算器和逆波兰计算器 前缀表达式 中缀表达式 后缀表达式 逆波兰表达式

元气小坏坏 提交于 2019-12-20 04:31:01
阅读目录 栈实现综合计算器思路及Python实现 思路 Python实现 模拟逆波兰计算器思路及Python实现 思路 Python实现 正则表达式实现计算器 栈实现综合计算器思路及Python实现 思路 先建立一个“数栈”用来压入数字,还有一个“符号栈”用来压入运算符,规定:减法从栈底向栈顶方法运算,乘除法优先级高于加减法 具体操作过程:以 “3+2 6-2” 为例 (1)数栈和符号栈皆为空,指针从左向右扫描表达式,数栈入栈第一个数3,符号栈入栈第一个扫描到的运算符‘+’,指针继续移动,遇到‘2’,直接再入数字,此时2在栈顶,3在栈底,指针继续移动遇到运算符‘ ’ (2)因为 ‘ * ’ 的优先级高于在符号栈栈底的“+”,所以直接将乘法入栈 (3)指针继续移动,遇到6,直接入数栈,指针继续移动,遇到“-” (4)当前遇到的“-” 先不要入栈,而是从数栈栈pop出栈顶的6,在从字符栈pop出栈顶的“*”,然后再从数栈pop出当前栈顶的2 ;三个元素运算,等到12,将12压入数栈,最后把符号压入符号栈,此时两个栈的栈顶元素分别为:12 和 “-” (5)指针继续移动,遇到2,压入数栈,此时表达式全部扫描完,就顺序的从数栈和符号pop出数和运算符,并运算,数栈pop出栈顶元素2 符号栈pop出栈顶元素“-” ,数栈再pop出当前栈顶元素12,用规定的“减法从栈底向栈顶方法运算”,所以

数据结构与算法--栈、队列(队列)

馋奶兔 提交于 2019-12-20 00:21:39
Hello,everybody.我们又见面了。今天我们来学习一下队列这个数据结构,let’s Go,开始我们的征程吧。 首先,举两个生活中的常见例子。相信大家,在用电脑工作娱乐时,都会碰到这样的现象。当我们点击程序或进行其他操作时,电脑处于死机状态。正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍。之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的。 还有有个例子,在我们打客服热线时,有时会出现等待的现象。当其他客户挂断电话,客服人员才会接通我们的电话。因为客服人员相对于客户而言,总是不够的,当客户量大于客服人员时,就会造成排队等待的想象。 操作系统、客服系统,都是应用了一种数据结构才实现了这种先进先出的排队功能,这个数据结构就是队列。 队列(Queue): 是只允许在一端进行插入操作,在另一端进行删除操作的线性表。 队列也是一种特殊的线性表,是一种先进先出的线性表。允许插入的一端称为表尾,允许删除的一端称为表头。 上图,很形象的表示了队列的结构。排在前面的先出,排在后面的后出。换句话,先进的先出,后进额后出。我们在队尾插入数据,队头删除数据。 队列的抽象数据类型: 同样是线性表,队列也有类似线性表的操作,不同的是,插入操作只能在队尾,删除操作只能在队头。 上图是队列的抽象数据类型。 顺序存储的队列: