指针数组

Data Structures[翻译]

a 夏天 提交于 2020-03-05 14:24:52
Data Structures 【原文见: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dataStructures 】 作者 By timmac TopCoder Member 翻译 农夫三拳@seu drizzlecrj@gmail.com 即使计算机能够毫不夸张的每秒执行上百万次的数学运算,当一个问题变得庞大且复杂时,性能仍然是一个很重要的考虑方面。最至关紧要的关于快速解决问题的方面之一就是数据在内存中是如何存储的。 为了举例说明这点,可以试想你进入一个图书馆去查找某个学科的一本书。最有可能的是你能够使用一些电子参考或者在最坏情况下,有一个卡片目录来帮助你找到你想要的书的名称和作者。由于书籍都是按目录进行排放的并且在每一个目录中是按照作者的姓名排序的,因此这是一个直接并且轻松的过程,那么然后你就可以在书架上找到你想要的书了。 现在,假定你去图书馆找一本特定的书,然而这里没有排放好的书架,只有在房间角落有一些排成行的袋子,里面放满了可能相关可能不相关的书。这样就可能需要数个小时甚至数天来找到你需要的书了,这是一个对比性强的道理。这就是数据在没有存储为与应用相关的格式时软件运行的情况。 简单的数据结构(Simple Data Structures) 最简单的数据结构是原生的变量。他们存放单个值,并且使用中受限

Java 集合小结

倖福魔咒の 提交于 2020-03-05 12:26:33
1.List 1.1 ArrayList 以数组实现。节约空间,但数组有容量限制。 超出限制时会增加50%容量,用System.arraycopy()复制到新的数组。因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组 。 按数组下标访问元素-get(i)、set(i,e) 的性能很高,这是数组的基本优势。 如果按下标插入元素、删除元素- add(i,e)、 remove(i)、remove(e),则要用System.arraycopy()来复制移动部分受影响的元素 ,性能就变差了。 越是前面的元素,修改时要移动的元素越多。直接在数组末尾加入元素-常用的add(e),删除最后一个元素则无影响。 1.2 LinkedList 以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,每插入一个元素都要构造一个额外的Node对象,也需要额外的链表指针操作。 按下标访问元素-get(i)、set(i,e) 要悲剧的部分遍历链表将指针移动到位 (如果i>数组大小的一半,会从末尾移起)。 插入、删除元素时修改前后节点的指针即可,不再需要复制移动。但还是要部分遍历链表的指针才能移动到下标所指的位置。 只有在链表两头的操作-add()、addFirst()、removeLast()或用iterator()上的remove()倒能省掉指针的移动。 Apache

数据结构与算法单排日记-2020/2/29-队列

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-05 06:25:27
1.队列是一个有序列表,可以用数组或者链表表示。 2.遵循先入先出的原则:先存入队列的数据,要先取出。后存入的要后取出。 数组模拟队列 队列本身是一个有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下。其中 maxSize是该队列的最大容量 。 因为队列的输出、输入分别从前后端来处理,因此需要两个 变量front及rear分别记录前后端 的下标。 初始化 rear初始值默认为-1; rear指向队列尾的位置(就是队列尾) front初始值默认为-1; front指向队列首的前一个位置(不是队列首) 将数据存入队列(addQueue): 将尾部指针往后移,rear+1,如果front=rear,则队列为空 若rear小于最大下标maxSize-1,那么将数据存入rear所指的数组元素中。否则无法存入。 rear==maxSize-1,则队列已满。 当数据出队列时: 首指针往后移:front+1 代码实现: public class DemoQueue { /* 当将数据存入队列时: 1.将尾指针往后移:rear+1,当front==rear,队列为空 2.若尾指针rear==maxSize-1时,队列满,无法存入数据 当数据出队列时: 首指针往后移:front+1 */ private int maxSize ; //数组最大容量 private int rear ;

C语言-怎么找115资源

眉间皱痕 提交于 2020-03-04 22:21:54
C 语言的起源与发展 C 语言的开发 Dennis M. Ritchie Bell Labs/Lucent Technologies Murray Hill, NJ 07974 USA 摘要 C 编程语言是在 1970 年代早期作为初创的 Unix 操作系统的系统实现语言而设计的。起源于无类型的 BCPL 语言,它发展出了类型结构;它建立在一个小机器上、作为改善其贫乏的编程环境的工具,它现在已经成为占主导地位的语言之一。本文研讨它的演变。   注意: *Copyright 1993 Association for Computing Machinery, Inc. This electronic reprint made available by the author as a courtesy. For further publication rights contact ACM or the author. This article was presented at Second History of Programming Languages conference, Cambridge, Mass., April, 1993. It was then collected in the conference proceedings: History of Programming

链表的创建、遍历、删除、插入和清空

十年热恋 提交于 2020-03-04 16:19:25
一、链表的概念   链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 二、链表和数组的区别: 1、数组静态分配内存,链表动态分配内存。 2、数组在内存中是连续的,链表是不连续的。 3、数组利用下标定位,查找的时间复杂度是O(1),链表通过遍历定位元素,查找的时间复杂度是O(N)。 4、数组插入和删除需要移动其他元素,时间复杂度是O(N),链表的插入或删除不需要移动其他元素,时间复杂度是O(1)。 数组的优点 1、随机访问性比较强,可以通过下标进行快速定位。 2、查找速度快 数组的缺点 1、插入和删除的效率低,需要移动其他元素。 2、会造成内存的浪费,因为内存是连续的,所以在申请数组的时候就必须规定七内存的大小,如果不合适,就会造成内存的浪费。 3、内存空间要求高,创建一个数组,必须要有足够的连续内存空间。 4、数组的大小是固定的,在创建数组的时候就已经规定好,不能动态拓展。 链表的优点 1、插入和删除的效率高,只需要改变指针的指向就可以进行插入和删除。 2、内存利用率高,不会浪费内存,可以使用内存中细小的不连续的空间,只有在需要的时候才去创建空间。大小不固定,拓展很灵活。 链表的缺点 查找的效率低,因为链表是从第一个节点向后遍历查找。 单链表和双链表 三、链表环问题 判断是否有环    定义一个快指针和一个慢指针

C++数组指针不能自增1/自减1

和自甴很熟 提交于 2020-03-04 12:27:08
我们知道指针可以自增1/自减1,如下面这个代码是没问题的 int *var; var++; 但如果var是指向数组的指针,那么var++是非法的,如下面例子 #include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { *var = i; // 这是正确的语法 var++; // 这是不正确的 } return 0; } 把指针运算符 * 应用到 var 上是完全可以的,但修改 var 的值是非法的。这是因为 var 是一个指向数组开头的常量,不能作为左值。var++会修改var的地址,但var 只能是指向数组第一个元素的指针,不能修改。 但是下面代码是允许的 *(var + 2) = 500; 来源: CSDN 作者: Mr.Jcak 链接: https://blog.csdn.net/weixin_38314865/article/details/104648702

第三十天

寵の児 提交于 2020-03-03 02:22:20
f返回的值是指针 格式 类型名 *函数名(参数表列); 例如 指针函数是指带指针的函数,就是函数 函数指针是指指向函数的指针,因此这个是指针变量 一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量,一维指针数组的定义形式为 类型名 数组名[数组长度]; 例如 int *name[4]; int i; 定义整形变量i; int *p; p为指向整形数据的指针变量 int a[n]; 定义整形数组a,他有n个元素 int *p[n]; 定义指针数组p,它由n个指向整形数据的指针元素组成 int (*p)[n]; p为指向含你个元素的一维数组的指针变量 int f(); f为带回整形函数值得函数 int *p(); p为带回一个指针的函数,该指针指向执行数据 int **p; p是一个指针变量,它指向一个指向整形数据的指针变量 指针变量可以有空值 p=null; 指针变量可以相减 如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数 若;两个指针指向同一个数组的元素,则可以进行比较,指向前面的元素的指针变量“小于”指向后面元素的指针变量 void作用 对函数返回的限定 对函数参数的限定 例如void abc(void) 还可以加一种void指针:不指定它是指向哪一种类型数据的指针变量 仅仅是存地址

C风格字符串

大城市里の小女人 提交于 2020-03-02 21:08:55
尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因。 字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串。C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。按此习惯书写的字符串存放在字符数组中并以空字符串结束。以空字符结束的意思是在字符串最后一个字符后面跟着一个空字符('\0')。一般利用指针来操作这些字符串。 C标准库String函数 下表列出了C语言标准库提供的一组函数,这些函数可用于操作C风格字符串,它们定义在出string头文件中,出string是C语言头文件string.h的C++版本。 C风格字符串的函数 strlen(p)      返回p的长度,空字符不计算在内 strcmp(p1,p2) 比较p1和p2的相等性。如果p1==p2,返回0;如果p1>p2,返回一个正值;如果p1<p2,则返回一个负值 strcat(p1,p2)    将p2附加到p1之后,返回p1 strcpy(p1,p2)    将p2拷贝给p1,返回p1 传入此类函数的指针必须指向 以空字符作为结束的数组 : char ca[]={'c','+','+'}; //不以空字符结束 cout<<strlen(ca)<<endl; //严重错误

Leetcode-数组&链表

可紊 提交于 2020-03-02 09:37:52
常见双指针技巧用法,只总结思路,具体边界判定想不清楚的时候稍微画个图就行了 1. 快慢指针判断链表是否含有环、环入口(快慢指针再次相遇即有环;再从头节点和快慢指针的相遇位置同速度向后,相遇点即为环入口)。 2. 快慢指针找链表中点、倒数第k个元素(快指针到达 Null 时慢指针所处位置即为中点;快指针先走k步,然后和慢指针一起同速度向后,快指针到达 Null 时慢指针的位置就是倒数第k个节点)。 3. 左右指针二分查找、在有序数组中找两数之和、反转数组 4. 滑动窗口,典型题包括 #76、#438、#3 76. 最小覆盖子串 https://leetcode-cn.com/problems/minimum-window-substring/ 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 解: 可以用滑动窗口技巧,left 和 right 指针都初始化为0,然后 right 向右滑动直到 s[left, ..., right] 中包括了T串中所有的字符,就得到一个可能的解,再令 left

指针知识(三):指针与数组

半城伤御伤魂 提交于 2020-03-02 06:17:56
数组的概念与指针的概念联系非常解密。其实 数组的标识 相当于它的 第一个元素的地址 ,如:int a[5],数组名a指向它的第一个元素a[0]的地址。 有语句如下: int a[5]; int * p; 下面的赋值为合法的: p = a; 这里指针p 和a 是等价的,它们有相同的属性,唯一的不同是我们可以给指针p赋其它的数值,而a 总是指向被定义的5个整数组中的第一个。所以,p只是一个普通的指针变量,而与之不同,a 是一个指针常量(constant pointer),数组名的确是一个指针常量。因此虽然前面的赋值表达式是合法的,但下面的不是: a = p; 因为a 是一个数组(指针常量),常量标识不可以被赋其它数值。 由于变量的特性,以下例子中所有包含指针的表达式都是合法的: #include <iostream> using namespace std; int main() { int a[5]; int *p; p = a;      //p是a[0]的地址,因a指向a的首地址,即指向a[0], *p = 10;    //即a[0]=10 p++; *p = 20;   //a[1]=20 p = &a[2]; *p = 30;   //a[2]=30; p = a +3; *p = 40;    //a[3]=40 p = a; *(p+4) = 50; //a[4]=50