线性结构

一步一步写算法(之线性结构的处理)

我只是一个虾纸丫 提交于 2020-04-03 14:33:46
原文: 一步一步写算法(之线性结构的处理) 【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 我们知道,在内存中的空间都是连续的。也就是说,0x00000001下面的地址必然是0x00000002。所以,空间上是不会出现地址的突变的。那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以是堆。数组有很多优势,它可以在一段连续空间内保存相同类型的数据,并且对这些数据进行管理。所以从这个意义上说,掌握了数组才能说明你数据结构入门了。 那么,在实际开发中,我们对线性结构应该注意些什么呢?我个人的观点: (1)数组的资源是有限的,必须确定资源的范围 (2)数组中资源的申请和释放必须一一对应,否则很容易造成资源泄漏的现象 (3)数组中的注意事项同样应用于堆分配的连续内存资源空间中 下面是自己设计的一个int分配的小程序,大家可以一起尝试一下: a)设计内存节点的数据形式 typedef struct _DATA_NODE { int* pData; char* pFlag; int num; }DATA_NODE; #define STATUS int #define TRUE 1 #define FALSE 0 b)创建内存节点 DATA_NODE* malloc_node(int number) { DATA_NODE*

c++(线性结构的处理)

喜欢而已 提交于 2020-04-03 14:30:14
我们知道,在内存中的空间都是连续的。也就是说,0x00000001下面的地址必然是0x00000002。所以,空间上是不会出现地址的突变的。那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以是堆。数组有很多优势,它可以在一段连续空间内保存相同类型的数据,并且对这些数据进行管理。所以从这个意义上说,掌握了数组才能说明你数据结构入门了。 那么,在实际开发中,我们对线性结构应该注意些什么呢?我个人的观点: (1)数组的资源是有限的,必须确定资源的范围 (2)数组中资源的申请和释放必须一一对应,否则很容易造成资源泄漏的现象 (3)数组中的注意事项同样应用于堆分配的连续内存资源空间中 下面是自己设计的一个int分配的小程序,大家可以一起尝试一下: a)设计内存节点的数据形式 typedef struct _DATA_NODE { int* pData; char* pFlag; int num; }DATA_NODE; #define STATUS int #define TRUE 1 #define FALSE 0 b)创建内存节点 DATA_NODE* malloc_node(int number) { DATA_NODE* pDataNode = NULL; if(0 == number) return NULL; pDataNode = (DATA_NODE*)

数据结构 02-线性结构4 Pop Sequence

Deadly 提交于 2020-04-01 11:08:12
刚开始拿到这道题的时候错误的做法: 1 //相邻之间的数小于等于M 2 //首先弹出来的数小于等于M 3 #include<stdio.h> 4 #include<math.h> 5 #define MAXN = 1000000; 6 int M,N,K; 7 int main(){ 8 int pre,now,i,j,flag=0; 9 scanf("%d %d %d",&M,&N,&K); 10 for(i=0;i<K;i++){ 11 flag = 0; 12 scanf("%d",&now); 13 if(now>M) flag=1; 14 for(j=1;j<N;j++){ 15 pre = now; 16 scanf("%d",&now); 17 if(abs(pre-now)>M) flag=1; 18 } 19 if(flag==1) printf("NO\n"); 20 else printf("YES\n"); 21 } 22 23 return 0; 24 } 后来发现问题后,重新选择的方法: 1 #include<stdio.h> 2 #define MAXN 10000 3 int M,N,K; 4 int b[MAXN],stack[MAXN],top; 5 int detect(); 6 int main(){ 7 int p,i,j,flag=0;

常见的线性结构

懵懂的女人 提交于 2020-03-29 08:58:51
目录 前言 数组 数组介绍 自定义数组 实现数组的增删改查方法 动态数组 时间复杂度分析 栈 栈介绍 定义栈接口 基于数组实现栈的基本操作 使用栈实现“括号匹配”问题 队列 队列介绍 定义队列接口 数组队列 循环队列 数组队列和循环队列的性能比较 链表:最基础的动态数据结构 链表介绍 实现链表的增删改查操作 通过自定义链表实现栈 通过自定义链表实现队列 递归 前言   本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间复杂度分析,对不同的实现进行比较和优化,即侧重于代码实现。由于数据结构是实践性比较强的一个科目,希望大家在看这篇博客时,自己也去写一下代码,看一下运行结果是不是自己想要的,我也会贴出我的运行结果来进行分析。 数组 数组介绍   数组是在内存中存储相同数据类型的连续的空间,最大的优点:查询快速。   数组最好应用于“索引有语意”的情况,例如索引代表学生学号,我们可以根据学号获取这个学生对象的信息。但并非所有有语意的索引都适用于数组,例如身份证号,我们不可能拿身份证号作为索引,因为身份证长度是18位数,而且身份证号也不是连续的,这样会浪费很大的内存空间。   数组也可以处理“索引没有语意”的情况,若索引没有语意时,如何表示没有元素?我们应该如何去添加元素、如何去删除元素呢?为了解决这些问题

02-线性结构4 Pop Sequence (25 分)

这一生的挚爱 提交于 2020-03-06 18:13:35
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4. Input Specification: Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines

PTA 02-线性结构3 Reversing Linked List 题目解析

房东的猫 提交于 2020-03-06 17:04:17
Given a constant K and a singly linked list L , you are supposed to reverse the links of every K elements on L . For example, given L being 1→2→3→4→5→6, if K =3, then you must output 3→2→1→6→5→4; if K =4, you must output 4→3→2→1→5→6. Input Specification: Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤10^5) which is the total number of nodes, and a positive K (≤ N ) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1. Then N lines

线性存储结构-ArrayList、Vector

纵饮孤独 提交于 2020-02-15 16:08:45
ArrayList:采用数组的内部构建形式,也就是顺序存储模式。当新增一个对象时,如果当前长度超过预设,会使用System.arraycopy(定义一个更长的数组进行复制处理),这个时候开销比较大。 System.arraycopy,数组长度小于32的采用的是java层的遍历处理,长数组采用的是native层的处理 /** * The byte array length threshold below which to use a Java * (non-native) version of arraycopy() instead of the native * version. See b/7103825. */ private static final int ARRAYCOPY_SHORT_BYTE_ARRAY_THRESHOLD = 32; /** * The byte[] specialized version of arraycopy(). * * @hide internal use only */ public static void arraycopy(byte[] src, int srcPos, byte[] dst, int dstPos, int length) { if (src == null) { throw new

数据结构(二) -- 数组和链表

一曲冷凌霜 提交于 2020-02-13 14:04:37
/*--> */ /*--> */ /*--> */ /*--> */ 数据结构(二) -- 数组和链表 数据结构主要可以分为两大模块: 线性结构 非线性结构 本文主要开始讲线性结构。 什么是线性结构 线性结构,顾名思义,就是这些数据所有节点都能被一根线(指针)联系起来的一种结构。 线性结构的存储方式: 连续存储:【数组】 离散存储:【链表】 线性结构的常见应用方式: 栈 队列 专题 :【递归】 数组和链表 本小节学习数组和链表,从底层去了解和实现数组与链表,并分析两者对应的优缺点 数组 数组是最常见的链式存储结构,它是一段连续的内存空间,在内存中我们可以简单表示为下图样式 通过上图我们可以把代码中 int arr[6] = {1,2,3,4,5,6}; 执行的操作从内存中脑补出来,同时我们可以简单分析一下,数组应该有的一些基本使用。如 初始化、 添加新元素、 插入新元素、 删除某个元素、 判断是否为空数组、 是否是满数组、 排序 倒序 查询是否包含某个元素 ······ 本小节就带着你手把手实现一个简单的数组的封装,借此来了解数组的数据结构以及内部的一些基本算法知识。这里就简单的以一个 int 类型的数组来示例,后面学到泛型的时候便可更加好的理解数组的实现。 首先简单分析一下数组中基本的属性,我们有上面的数组内存中的逻辑图可以确定数组有对应的内存空间,有一个内存起始地址

线性结构 —— 循环数组

走远了吗. 提交于 2020-02-09 14:40:24
一、介绍  上一章讲得数组队列无法重复使用,这一章我们使用环形数组实现队列。 二、代码  使用环形数组模拟队列,首先编写一个CircleArray class CircleArray { private int maxSize; // 表示数据最大容量 private int front; // 指向队列头 第一个元素 private int rear; // 指向队列最后元素的下一个位置,我们约定空出一个元素空间 private int[] queue; // 队列 // 创建队列构造器 public CircleArray(int maxSize) { this.maxSize = maxSize; queue = new int[maxSize]; } // 当队列满时,rear是最后一个元素位置,因为是环形结构 + 1就变成头元素位置,取模是因为front索引有可能是0 public boolean isFull() { return (rear + 1) % maxSize == front; } // 初始化时都为0 public boolean isEmpty() { return rear == front; } // 添加元素 front不变,rear + 1,取模是因为获得索引,保证不超出最大范围 public void addQueue(int n) { if

线性结构

不羁的心 提交于 2020-02-05 15:22:59
一、请问你对线性表的定义有什么理解? 答:线性表是n个元素的有限序列。存在唯一的一个“第一个”和“最后一个”的元素。除表头外,每个元素只有唯一的直接前驱;除表尾外,每个元素只有一个唯一的直接后驱。 二、请你谈一下线性表有哪些存储结构? 答:①顺序存储:是用一组地址连续的存储单元依次存储线性表中的数据元素。 优点:可以随机存储表中的元素。 缺点:插入和删除操作需要移动大量的元素。 在线性表的顺序存储结构中,第i个元素ai的存储位置为LOC(ai)=LOC(a1)+(i-1)*L。 LOC(a1)是表中第一个元素的存储位置;L是表中每个元素所占空间的大小。 ②链式存储:是指用节点来存储数据元素,节点的空间可以是连续的,也可以是不连续的,因此存储数据元素的同时必须存储元素之间的逻辑关系。最基本的节点结构包括数据域和指针域。数据域用于存储数据元素的值。指针域用于存储当前元素的直接前驱或直接后驱信息。常用的链表结构有双向链表,循环链表和静态链表。 优点:插入和删除操作不许需要移动元素; 缺点:不能进行数据元素的随机访问。 三、请阐述一下线性表的插入和删除运算? 答:①基于顺序存储结构的运算。在等概率下平均移动元素的次数分别为:插入-n/2;删除-(n-1)/2. ②基于链式存储结构的运算。其实质都是对相关指针的修改。                          来源: CSDN 作者: