指针

数据结构基础概念篇

半城伤御伤魂 提交于 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> 一些概念 数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系

LeetCode 42:接雨水

a 夏天 提交于 2019-12-21 23:42:51
LeetCode 42:接雨水 题目描述 解题思路 代码实现 总结 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 解题思路 借助栈的结构来解决,设定 指针初始位置为0 ,在越界的前提下, 依次向后 移动,在 初始及栈顶元素的高度大于当前指针所指高度 时, 压栈 操作, 指针后 移。当 栈不为空且 , 栈顶元素高度小于当前指针的高度 时,将 栈顶 高度的值 存入中间变量 ,并将栈顶 弹 出。此时如果 栈为空 的话,说明没有另外一面墙和其配对, 则break 继续 压栈指针后移 。 否则 ,记录两面墙之间的距离,用 两面墙中的最小值与距离相乘 ,即 为面积 。,重复上述操作,记录累计的面积和!!!!! 代码实现 去 博客设置 页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片 . import java . util . Stack ; public class waterContaining { //接雨水 public int trap ( int [ ] height ) { //acc: 8ms 30% int sum = 0 ; //雨水总量 Stack < Integer > stack = new Stack < > ( ) ; int current = 0 ; //指针初始位置 while

详解快速排序算法(Java版)

 ̄綄美尐妖づ 提交于 2019-12-21 19:18:46
前言 快速排序(Quick Sort)算法和冒泡排序算法类似,都是基于交换排序的思想。快速排序算法对冒泡排序算法进行了改进,从而具有更高的执行效率。而且也是面试常考的一种算法,不仅得会写,更主要的是理解其中的思想。 快速排序的流程 (1)首先设定一个分界值,通过该分界值将数组分为左右两部分 (2)将大于等于分界值的数据集中到数组的右边,小于分界值的数据集中到数组的左边,此时左边部分中各元素都小于等于分界值,右边部分中各元素都大于分界值 (3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样将左边放置较小值,右边放置较大值。右侧的数组也做类似处理。 (4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好后,再递归排好右侧部分的顺序。当左、右两部分各数据排序完成后,整个数组的排序也就完成了 详细代码 上面的流程,一般看完后会懵懵懂懂,结合下面的代码,然后慢慢理解 public class MyQuickSort { static final int SIZE = 18; /** * @param arr 待排序的数组 * @param left 数组的左边界(例如,从起始位置开始排序,则left=0) * @param right 数组的右边界(例如,排序截至到数组末尾,则right=arr.length-1)

几百万数据放入内存不会把系统撑爆吗?

£可爱£侵袭症+ 提交于 2019-12-21 19:02:57
在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单独的服务器,配置是四核八G的,配置堆的大小是4G。本着怀疑的精神,就想要弄清楚几百万条数据真的放入内存的话会占用多少内存呢? 计算机的存储单位 计算机的存储单位常用的有 bit 、 Byte 、 KB 、 MB 、 GB 、 TB 后面还有但是我们基本上用不上就不说了,我们经常将 bit 称之为比特或者位、将 Byte 简称为 B 或者字节,将 KB 简称为 K ,将 MB 称之为M或者兆,将 GB 简称为 G 。那么他们的换算单位是怎样的呢? 换算关系 首先我们得知道在计算机中所有数据都是由 0 1 来组成的,那么存储 0 1 这些二进制数据是由什么存放呢?就是由 bit 存放的,一个 bit 存放一位二进制数字。所以 bit 是计算机 最小的存储单位 。 大部分计算机目前都是使用8位的块,就是我们上面称之为的字节 Byte ,来作为计算机容量的基本单位。所以我们一般称一个字符或者一个数字都是称之为占用了多少字节。 了解了上面关于位和字节的关系后,我们可以看一下其他的单位换算关系 1B

C:字符数组和字符指针

依然范特西╮ 提交于 2019-12-21 14:20:33
   C语言中没有string类型,字符串都是通过char字符数组来存储的   char * str = "Hello" (字符指针)   char str[6] = "Hello" (字符数组)   char line[10] = "Hello"  编译器编译后数组长度为6,自动生成\0都是{'H','e','l','l','o','\0'}   当用char *str 初始化字符串数组之后,该数组为只读数组(实际上是const常量,不可修改),在代码段中,不可以对其修改,如s[0] = ‘s’,否者报错      char * str = "Hello" 等价于char * str;  str = "Hello"   当用char str[6]初始化字符串数组之后,该数组是可以修改的      只能使用 char str[6] = "Hello",不可以char str[6];  str[6] = "Hello"     如果要构造字符串,用数组      如果要处理字符串,用指针    char *表示的是字符串或者是单个字符   要写入字符串数组,要开辟新的空间(以后补充)          对于逃逸字符,可以使用//来输出 字符串的输入和输出   char string[8];   scanf("%s",&string);   printf("%s",string);  

C/C++中函数指针的含义

帅比萌擦擦* 提交于 2019-12-21 14:19:15
函数存放在内存的代码区域内,它们同样有地址,我们如何能获得函数的地址呢?    如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址。    定义一个指向函数的指针用如下的形式,以上面的test()为例: int (*fp)(int a);//这里就定义了一个指向函数的指针   函数指针不能绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很容易犯如下的错误。 int *fp(int a);//这里是错误的,因为按照结合性和优先级来看就是先和()结合,然后变成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注意!   下面我们来看一个具体的例子: #include < iostream > #include < string > using namespace std; int test( int a); void main ( int argc , char * argv []) { cout <<test<<endl; //显示函数地址 int (*fp)( int a); fp=test; //将函数test的地址赋给函数学指针fp cout <<fp(5)<<"|"<<(*fp)(10)<<endl; //上面的输出fp(5),这是标准c++的写法,(*fp)(10

C:函数指针

二次信任 提交于 2019-12-21 09:41:32
# include <stdio.h> int max ( int a , int b ) { return a > b ? a : b ; } int min ( int a , int b ) { return a < b ? a : b ; } int compare ( int a , int b , int ( * pf ) ( int , int ) ) { return pf ( a , b ) ; } void fast ( int a [ ] ) { } void shell ( int a [ ] ) { } void sort ( int a [ ] , void ( * pf ) ( int [ ] ) ) { pf ( a ) ; } // 函数指针 函数指针是指向函数的指针 // 指针函数 指针函数是返回值为指针的函数 int main ( ) { int ( * pf ) ( int , int ) = NULL ; pf = min ; printf ( "%d \r\n" , compare ( 5 , 3 , pf ) ) ; //printf("%d \r\n", pf(5, 3)); //printf("%p \r\n", max); return 0 ; } 来源: CSDN 作者: hahahafree 链接: https://blog

24.输入一个二叉搜索树,将该树转换为一个排序的双向链表

落爺英雄遲暮 提交于 2019-12-21 07:13:14
package java2019 ; import java . util . Stack ; //输入一个二叉搜索树,将该树转换为一个排序的双向链表(不创建新的节点,只能调整树中节点指针的指向) //核心是中序遍历非递归算法 //修改当前遍历节点与前一遍节点的指针指向 public class Demo24 { //中序非递归算法 public void InorderTravel ( TreeNode root ) { Stack < TreeNode > stack = new Stack < TreeNode > ( ) ; TreeNode p = root ; while ( p != null || ! stack . empty ( ) ) { while ( p != null ) { //一直向左并将沿途节点压入堆栈 stack . push ( p ) ; p = p . left ; } p = stack . pop ( ) ; System . out . println ( p . val + " " ) ; p = p . right ; } } //前序非递归算法 public void PreorderTravel ( TreeNode root ) { Stack < TreeNode > stack = new Stack <

c语言中指针常见的错误

∥☆過路亽.° 提交于 2019-12-21 07:09:53
指针使用在c/c++中 指针在c/c++中非常强大 但是初学者使用经常带来一些错误 以下整理博主自己在开发过程中 存在的一些错误点 // 1. 存储数据时,越界 void test01 ( ) { // 1. 数组操作越界 char name [ ] = "googleyst" ; printf ( "%c" , name [ 100 ] ) ; // 2. 指针不断操作导致越界 char my_str [ ] = "hello world" ; char * p_str = ( char * ) malloc ( 64 ) ; for ( int i = 0 ; i <= strlen ( my_str ) ; ++ i ) { * p_str = my_str [ i ] ; p_str ++ ; } free ( p_str ) ; } // 2. 返回局部变量的地址 int * test02 ( ) { int a = 10 ; return & a ; } // 3. 多次释放指针指向的空间 void test03 ( ) { char * p = malloc ( sizeof ( char ) * 64 ) ; free ( p ) ; free ( p ) ; } // 4. 悬挂指针(野指针) void test04 ( ) { char * name =

cvte面试c++总结

妖精的绣舞 提交于 2019-12-21 05:07:51
在C++中,源程序变为可执行程序的正确顺序 编辑、编译、链接、执行 虚函数,纯虚函数,多态性 1、纯虚函数(pure virtual)纯虚函数的定义形式:virtual { } = 0;纯虚函数就是 基类只声明函数体 ,没有实现过程。时对子类的约束,是接口继承。 2、虚函数(Impure virtual)虚函数的定义形式:virtual {method body};c++的虚函数是 基类提供虚函数的实现 ,为子类提供默认的函数实现。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。 虚函数只能借助于指针或者引用来达到多态的效果。 3、抽象类含有纯虚函数的类被称作抽象类,而 只含虚函数的类不能被称作抽象类 。抽象类是不能使用new创建新对象的,也就是抽象类不能被实例化,只有抽象类的派生类才可以用new创建对象。 4、多态性多态性是指相同对象收到不同消息或者不同对象收到相同消息时产生不同的实现动作。c++支持两种多态性: 编译时多态性、运行时多态性 。编译时多态性:通过重载函数实现。运行时多态性:通过虚函数实现。 一、定义 纯虚函数是在基类中声明的虚函数 ,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法