数据结构

c#数据结构———栈

随声附和 提交于 2020-02-16 09:50:47
栈是栈是受约束的链表,栈是一种后进先(LIFO)出的数据结构。 using System; using LinkedListLibrary; // 栈是受约束的链表 // 栈底结点的链接成员社为 null namespace StackInheritanceLibrary { public class StackInheritance:List { public StackInheritance(): base ("stack") { } public void Push( object dataValue) // 压栈 { InsertAtFront(dataValue); } public object Pop() // 出栈 { return RemoveFromFront(); } } } 第二种实现方法 using System; using LinkedListLibrary; // 通过合成来重用 List 类 namespace StackCompositionLibrary { public class StackComposition:List { public List stack; public StackComposition() { stack = new List("stack"); } public void Push( object

算法基础—数据结构—单链表

巧了我就是萌 提交于 2020-02-16 01:21:03
对于链表我想大家应该都不陌生,但是再算法里面,一般以静态链表为准(数组模拟链表)。主要是因为快。 这里总结了基本算法用到的一些模板,不出意外应该就这些,再看代码的时候希望画图理解qwq // head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 int head, e[N], ne[N], idx; //初始化 int intx(){ head = -1; idx = 0; } // 在链表头插入一个数 int add_head(int x){ e[idx] = x; ne[idx] = head; head = idx++; } //将头结点删除,保证头结点存在 int remove(){ head = ne[head]; } //在链表中插入一个数 int add(int k,int x){ e[idx] = x; ne[idx] = ne[k]; ne[k] = idx++; } //再链表中删除一个数 int remove_d(int k){ ne[k] = ne[ne[k]] } 直接根据题目来看吧。 https://www.acwing.com/problem/content/828/ 题目要求就是根据不同的操作来模拟链表,最后遍历输出。 #include<bits/stdc++.h> using namespace

数据结构实验:连通分量个数

主宰稳场 提交于 2020-02-15 23:31:15
Description 在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为连通图, 否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含的顶点个数极大。 例如:一个无向图有5个顶点,1-3-5是连通的,2是连通的,4是连通的,则这个无向图有3个连通分量。 Input 第一行是一个整数T,表示有T组测试样例(0 < T <= 50)。每个测试样例开始一行包括两个整数N,M,(0 < N <= 20,0 <= M <= 200) 分别代表N个顶点,和M条边。下面的M行,每行有两个整数u,v,顶点u和顶点v相连。 Output 每行一个整数,连通分量个数。 Sample Input 2 3 1 1 2 3 2 3 2 1 2 Output 2 1 Hint # include <iostream> # include <bits/stdc++.h> int father [ 202 ] ; int findFather ( int x ) { while ( x != father [ x ] ) x = father [ x ] ; return x ; } void Union ( int x , int y ) { int fatherX = findFather ( x ) ; int

Java数据结构漫谈-LinkedList

て烟熏妆下的殇ゞ 提交于 2020-02-15 16:10:17
同样是List的数据结构,LinkedList是使用了前后指针,指明节点的方式来表示链表的,这与之前介绍的ArrayList http://www.cnblogs.com/yakovchang/p/java_arraylist.html 中使用数组的方式是截然不同的。LinkedList中的存储节点被称作节点(Node),一个节点的定义如下所示: private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } } 这是LinkedList的一个内部类,不需要使用LinkedList的程序员关心。 LinkedList正是通过next,prev这两个指针来串联起整个List的。 注意:Node节点在初始化的时候同时指明了初始化的节点的前后节点是什么,所以在之后的代码中,往往没有明显的写明新的节点的前后指针指向了哪里。 在LinkedList本身中仅仅记录了List的开始和结束节点,当然,也记录了size: transient int size = 0; transient Node<E> first;

错题本——数据结构(树)

不羁的心 提交于 2020-02-15 08:24:41
树 在任意一棵非空二叉排序树T1中, 删除某结点v之后形成二叉排序树 T2,再将v 插入T2形成二叉排序树T3。下列关于T1与T3的叙述中,正确的是( )。 I.若 v 是 T1的叶结点,则 T1 与 T3 不同 II. 若 v 是 T1的叶结点,则 T1与 T3相同 III.若 v 不是 T1 的叶结点,则 T1 与 T3 不同 IV.若v 不是 T1 的叶结点,则 T1 与 T3 相同 解析: 以下说法正确的是( )。 A 若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的前序遍历结果序列的最后一个结点。 B 若有一个结点是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定是该子树的中序遍历结果序列的最后一个结点。 C 若有一个页子结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的前序遍历结果序列的最后一个结点。 D 若有一个页子结点是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定是该子树的中序遍历结果序列的最后一个结点。 解析: A:中序遍历结果为AB,前序遍历结果为BA,因此错误 B:前序遍历结果为BA,中序遍历结果为AB,因此错误 C:中序遍历的情况下,固定了叶子结点为最后一个结点,因此一定有右子树,中序遍历和前序遍历的顺序都是将右子树放在最后一个,因此C正确 D:前序遍历的情况下

错题本——数据结构(堆)

穿精又带淫゛_ 提交于 2020-02-15 05:38:11
堆 下标从1开始,在含有n个关键字的小根堆(堆顶元素最小)中,关键字最大的记录有可能存储在( )的位置上 A [n/2] B [n/2]-1 C 1 D [n/2]+2 解析: 小根堆中最大的数一定是放在叶子节点上,堆本身是个完全二叉树,完全二叉树的叶子节点的位置大于 [ n / 2 ] [n/2] [ n / 2 ] 补充: 完全二叉树的顺序结构 对于一个完全二叉树,假设它有n个结点,对结点进行从1开始编号,对任一结点 i 满足下面: 它的双亲是结点 i/2 (除了i=1的情况) 左孩子是 2i 右孩子是 2i+1 如果2i>n 说明无左孩子 2i+1>n 说明无右孩子 如. 来源: CSDN 作者: 白羊_Aries 链接: https://blog.csdn.net/qq_38204302/article/details/104311184

数据结构与算法之PHP排序算法(快速排序)

拜拜、爱过 提交于 2020-02-15 05:33:17
一、基本思想 快速排序又称划分交换排序,是对冒泡排序的一种改进,亦是分而治之思想在排序算法上的典型应用。 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列的目的。 二、算法过程 1)从数列中挑出一个元素,称为“基准值”; 2)将待排序元素进行分区,比基准值小的元素放在基准值前面,比基准值大的元素放在基准值后面。分区结束后,该基准值就处于数组的中间位置; 3)对左右两个分区重复以上步骤直到所有元素都是有序的。 三、算法图解及 PHP代码实现 1、替换版 上图只给出了第1趟快速排序的流程。在第1趟排序中,设置pivot=arr[i],即pivot=3。 1) 右 → 左 查找小于pivot的数:找到满足条件的数arr[j]=2,此时j=4;然后将a[j]赋值a[i],此时i=0;接着从左往右遍历。 2) 左 → 右 查找大于pivot的数:找到满足条件的数arr[i]=4,此时i=1;然后将a[i]赋值a[j],此时j=4;接着从右往左遍历。 3) 右 → 左 查找小于pivot的数:找到满足条件的数arr[j]=1,此时j=3;然后将a[j]赋值a[i],此时i=1;接着从左往右遍历。 4) 左 → 右

数据结构实验之排序四:寻找大富翁

匆匆过客 提交于 2020-02-15 04:07:51
Description 2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。 Input 首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔。 Output 一行数据,按降序输出资产排前M位的大富翁的个人资产值,数字间以空格分隔,行末不得有多余空格。 Sample Input 6 3 12 6 56 23 188 60 Output 188 60 56 Hint 请用堆排序完成。 # include <iostream> # include <bits/stdc++.h> using namespace std ; int heap [ 11 ] ; void downAdjust ( int low , int high ) //向下调整 { int i = low , j = i * 2 ; while ( j <= high ) { if ( j + 1 <= high && heap [ j ] > heap [ j + 1 ] ) j ++ ; if ( heap [ i ] > heap [ j ] ) { swap ( heap [ i ] ,

ES6 Map数据结构

左心房为你撑大大i 提交于 2020-02-15 03:20:55
Map JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。 ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。 const m = new Map(); const o = {p:"hello world"}; m.set(o,'content'); console.log(m.get(o)); // content console.log(m.has(o)); // true console.log(m.delete(o)); // true console.log(m.has(o)); // false 上面代码使用 Map 结构的set方法,将对象o当作m的一个键,然后又使用get方法读取这个键,接着使用delete方法删除了这个键。 上面的例子展示了如何向 Map 添加成员。作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。 const map = new Map([[