数据结构
文章平均质量分 54
zhao_miao
冲鸭
展开
-
一个数组实现两个栈(共享栈)(扩容)
一个数组实现两个栈的具体方法:一个数组实现两个栈(共享栈)但是上述方法的缺陷是数组的大小是恒定的,当数组满的时候就无法进行入栈操作。这篇博客我们将讲一下数组如何扩容? 实现方法:一个数组实现两个栈=====>>下标为0的位置为栈1的栈底,栈2的栈底在下标最大的位置上。栈1向左扩展,栈2向后扩展。若数组已满则增容。 首先定义一个共享栈的结构体:#define ...原创 2018-08-26 18:23:01 · 1527 阅读 · 3 评论 -
动态顺序表的基本操作
顺序表 顾名思义,就是用一段连续的存储单元依次存储数据元素的线性结构 。 顺序表又分为静态顺序表和动态顺序表。 静态顺序表的基本操作: https://blog.csdn.net/zhao_miao/article/details/81145855 下面我们来分析动态顺序表的基本操作: 我们要完成的基本操作是: 初始化 打印 尾部插入 尾部删除 头部插入 ...原创 2018-07-23 10:58:21 · 766 阅读 · 0 评论 -
静态顺序表的基本操作
顺序表 顾名思义,就是用一段连续的存储单元依次存储数据元素的线性结构 。 静态顺序表即顺序表的最大容量是确定的。 接下来我们要完成的基本操作是: 初始化 打印 尾部插入 尾部删除 头部插入 头部删除 查找指定元素 指定位置插入 删除指定位置元素 删除指定元素 删除所有的指定元素 返回顺序表的大小 判断顺序表是否为空...原创 2018-07-21 19:02:00 · 708 阅读 · 0 评论 -
一个数组实现两个栈(共享栈)
题目: 一个数组实现两个栈。 方法1: 下标为0的位置为栈1的栈底,下标为1的位置为栈2的栈底,栈1的元素存放在下标为偶数的位置上,栈2的元素放在下标为奇数的位置上。 如上图所示的数组:若栈1有一个元素 2,栈2有6个元素 1,2,3,4,5,6,下标为0的位置为 2,下标为1,3,5,7,9的位置分别为1,2,3,4,5。6无法插入但数组中还有很多剩余的空间。。可见该方法会...原创 2018-08-23 20:10:52 · 11611 阅读 · 1 评论 -
使用两个栈实现一个队列
题目:使用两个栈实现一个队列。 栈:后进先出。 队列:先进先出。 入队列: 直接入栈1。 出队列: 返回队列的队尾元素: 返回队列的队头元素: 队列为空: 栈1为空&&栈2为空。 队列元素个数: 栈1的元素个数+栈2的元素个数。参考代码: 设置一个队列由两个栈组成: typedef struct Queue{原创 2018-08-25 08:46:48 · 3345 阅读 · 0 评论 -
二叉搜索树的创建,删除,查找
二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有以下性质的二叉树若它的左子树不为空,则左子树上的所有结点的值都小于根结点的值。若它的右子树不为空,则右子树上的所有结点的值都大于根节点的值。它的左右子树也分别为二叉搜索树。 二叉搜索树的操作 查找关键字data:①.若根节点为空,即二叉搜索树为空。返回0。 ②.若data>根节点的da...原创 2018-09-02 09:11:58 · 7008 阅读 · 2 评论 -
二叉搜索树的应用---判断一个单词拼写是否正确、模拟实现简单字典
关于二叉搜索树的基本知识点:二叉搜索树的创建,删除,查找 模拟实现一个简单的字典即将二叉搜索树里数据域改为单词和翻译。查找时与单词比较,若相等,返回它的翻译。 代码: BSWordTree.h#define _CRT_SECURE_NO_WARNINGS 1#include<assert.h>#include<stdio.h>#inc原创 2018-09-02 16:43:44 · 574 阅读 · 0 评论 -
哈希表(散列表)、哈希表闭散列(线性探测、二次探测)解决冲突、负载因子
哈希概念常规搜索: 数据杂乱无章——->顺序查找—–>时间复杂度0(n)。 数据有序—–>二分查找——>时间复杂度0(log(n))。 建立二叉搜索树—–>时间复杂度0(n)(单支树)。 理想的搜索方法是:可以不经过任何比较,一次直接从表中得到要搜索的元素,如果构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立一一映原创 2018-09-13 15:36:45 · 6045 阅读 · 3 评论 -
堆的创建、插入、删除、堆排序
堆的概念: 如果有一个关键码的集合K={K(0),K(1),K(2)……K(n-1)},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:K(i)<=k(2* i+1)且 K(i)<=k(2* i+2)(K(i)>=k(2* i+1)且 K(i)>=k(2*i+2))i=0,1,2……则称为小堆(或大堆)。 说明: 任一结点的关键码均小于(...原创 2018-09-14 17:26:35 · 3635 阅读 · 1 评论 -
哈希变形----位图(假设给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中)
位图: 假设给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。遍历:将元素保存起来,遍历查找。树:创建一颗二叉搜索树。排序:排序之后用二分查找的方法。 这些方法随着集合中元素的增加,我们需要的存储空间就越来越大、不过我们可以通过一个函数将一个元素映射成一个位矩阵中的一个点,这样一来,我们只要看看这个点是不是1就知道集合里有没有它...原创 2018-09-14 20:43:40 · 494 阅读 · 0 评论 -
判断单链表是否带环?若带环求出环的长度?求出环的入口点?
如何判断单链表是否带环?单链表带环: 以上这几种情况为链表里面带有环。 那么如何判段链表里面是否有环呢? 我们设置两个指针fast,slow,两个指针均从头结点开始移动,如果链表带环,在环中两个指针的距离每次减小1,迟早会相遇,证明该单链表带环。 快慢指针在结点4处相遇,则证明该单链表有环,结点4是相遇点。linklist* CircleLinkList(l...原创 2018-07-27 17:30:09 · 516 阅读 · 0 评论 -
判断两个单链表是否相交?若相交求交点?(单链表无环)
怎样判断单链表是否相交? 如果两个链表相交,则两个链表就会有相同的结点。 方法1. 依次判断第一个链表中的结点是否都在第二个链表中。 方法2. 若两个单链表相交,则从交点之后的链表结点内容是一样的,即两个单链表最后一个结点一定是相同的,我们可以遍历两个结点,判断最后一个元素地址是否相同。 方法3.构环,将L2的最后一个结点指向L2的头结点,构成环,判断L1链表是否有...原创 2018-07-27 20:13:26 · 1081 阅读 · 0 评论 -
两个队列实现一个栈
关于两个栈实现一个队列的问题:两个栈实现一个队列 这篇博客我们讲两个队列实现一个栈。栈:后进先出 队列:先进先出 分析: 入栈: 哪一个队列有元素便入哪一个队列。 出栈: 返回栈顶元素: 栈的大小 两个队列的大小之和。 栈判空 两个队列均为空。代码实现: 设置一个栈由两个队列组成。队列为不带头结点的单链表,有两个指针,分...原创 2018-08-26 19:43:09 · 277 阅读 · 0 评论 -
求简单迷宫的路径
简单迷宫设置一个简单迷宫。(6*6) 定义迷宫入口。 迷宫入口要求:必须是边界。 3.开始走迷宫 a. 走当前步: 当前步入栈,将当前步标记为2 b. 判断当前栈顶元素是否是出口(是边界却不是入口),如果是就返回,若不是之星下一步。 c.取栈顶元素为当前步: d.走下一步: 假设优先顺序为上,左,右,下。 上:(横坐...原创 2018-08-26 21:54:38 · 445 阅读 · 0 评论 -
逆波兰表达式(后缀表达式)的计算
后缀表达式计算时,所有运算按照运算符出现的顺序,严格从左到右,每个操作符取前两个操作数进行运算,运算后的结果仍然作为下次的操作数。 那如果已知后缀表达式,如何求值: 举一个例子: 代码:#include&amp;lt;stdlib.h&amp;gt;#include&amp;lt;assert.h&amp;gt;#include&amp;lt;string.h&amp;gt;原创 2018-08-17 21:31:39 · 5854 阅读 · 3 评论 -
括号匹配问题(栈的应用)
栈: 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除等操作。 没有任何元素的栈称为空栈。 栈又称为 后进先出 的线性表。 括号匹配问题: 算法思路: 一个关于括号匹配的例子: 封装一个静态栈: #define Max 20#define DataType char typedef struct Stack{ DataType...原创 2018-08-17 18:10:34 · 890 阅读 · 0 评论 -
判断两个链表是否相交?若相交求出交点?(两个链表均带环)
关于链表相交的问题如果两个链表均不带环 判断两个不带环单链表是否相交?若相交求交点如果一个链表带环,一个链表不带环。两个链表不可能相交! 如果两个链表均带环:(有以下两种相交的情况) 如何判断链表是否带环,以及如何求环的入口点判断两个带环单链表是否相交: 分别判断两个单链表p1,p2是否带环,返回快慢指针的交点(此交点必在环内)meet1,meet2,一个指针不动,另一...原创 2018-08-16 19:23:55 · 576 阅读 · 0 评论 -
单链表的冒泡排序
单链表的冒泡排序 设置三个指针tail,p,cur;p和tail用于控制外循环的次数,cur用于内循环。排序开始前遍历一次单链表将tail指向尾结点的指针域,即NULL。cur和p均指向头结点。比较cur-&gt;data与cur-&gt;next-&gt;data的大小,若前者大于后者则交换;否则不交换,之后cur指针右移,继续比较cur-&gt;data与cur-&gt;next-...原创 2018-08-15 18:15:07 · 21380 阅读 · 8 评论 -
查找链表的倒数第k个结点(只能遍历一次结点),删除链表的倒数第k个结点。
查找链表的倒数第k个结点 方法:设置两个指针fast,slow 让快指针先走k步,随后两个指针一起向后移动,当快指针为空时,慢指针指向的结点即为链表的倒数第k个结点。 linklist * FindLastKNode(linklist *head,int k){ linklist *fast = head; linklist *slow = head; ...原创 2018-08-15 16:34:11 · 791 阅读 · 0 评论 -
复杂链表的复制(链表的每个结点,有一个next指针指向下一个结点,还有一个random指针指向这个链表中的一个随机结点或者NULL)
举一个复杂链表的例子: 首先我们需要创建一个复杂链表: 1. 要创建链表首先需要一个结构体:(结构体成员须包括数据,next指针,以及random指针)typedef struct node{ DataType data; struct node* next; struct node* random;}Clinklist;创建如上图所示的复杂链表...原创 2018-08-14 10:09:30 · 2399 阅读 · 0 评论 -
布隆过滤器(Bloom Filter)(给两个文件,分别有100亿个字符串,我们只要1g的内存,如何找到两个文件的交集?分别给出精确算法和近似算法?)
给两个文件,分别有100亿个字符串,我们只要1g的内存,如何找到两个文件的交集?分别给出精确算法和近似算法? 精确算法: 我们可以创建1000个文件,运用哈希函数先将文件1的字符串保存在对应的文件中,之后再文件2中取元素,通过哈希函数计算出哈希地址,去对应的文件里面找是否有与之相同的字符串。 近似算法: 我们可以使用位图的方法,通过一个函数将一个元素映射成一个位矩阵中的一个点,这样...原创 2018-09-15 12:59:22 · 2041 阅读 · 0 评论