数据结构

数据结构课程设计——药店的药品销售统计系统(排序应用)

ぐ巨炮叔叔 提交于 2020-02-24 05:13:15
药店的药品销售统计系统(排序应用) 问题描述 设计一系统,实现医药公司定期对销售各药品的记录进行统计,可按药品的编号,单价,销售量或销售额做出排名。 实现提示 在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。各药品的信息包括:药品编号、药名、药品单价、销出数量、销售额。药品编号共4位,采用字母和数字混合编号,如:A125,前一位为大写字母,后三位为数字,按药品编号进行排序时,可采用基数排序法。对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。 需求分析 对药品单价的排序采用——冒泡排序 对药品销售量排序采用——快速排序 对药品销售额的排序用——堆排序 对药品编号的排序采用——基数排序 品信息的元素类型定义 typedef struct node //药品信息的元素类型定义 { char num[30]; //药品的编号 char name[50]; //药品名称 float price; //药品单价 int amount; //销售量 float sales; //销售额 }Elemtype; //定义结构体类型(名称) 存储药品信息的顺序表的定义 typedef struct /

数据结构与算法--递归(recursion)

送分小仙女□ 提交于 2020-02-24 02:02:38
递归的概念 简单的说: 递归就是方法自己调用自己 ,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 递归调用机制 我列举两个小案例,来帮助大家理解递归 1、打印问题 2、阶乘问题 //输出什么? public static void test(int n) { if (n > 2) { test(n - 1); } System.out.println("n=" + n); } //阶乘 public static int factorial(int n) { if (n == 1) { return 1; } else { return factorial(n - 1) * n; }} 3、使用图解说明递归的调用机制 递归能解决什么样的问题 1、各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛) 2、各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等. 3、将用栈解决的问题-->第归代码比较简洁 递归需要遵守的重要规则 1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 2)方法的局部变量是独立的,不会相互影响, 比如n变量 3)如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据. 4)递归 必须向退出递归的条件逼近 ,否则就是无限递归

C数据结构与算法-基础整理-查找-02:哈希表的理解

大兔子大兔子 提交于 2020-02-24 01:04:52
0x01.什么是哈希表 散列表 (Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的 数据结构 。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做 散列函数 ,存放记录的 数组 叫做 散列表 。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 存储位置=F(关键字) F称为散列函数或哈希函数。 采用散列技术奖记录存储在一块连续的存储空间中,这块连续的存储空间称为哈希表(或散列表)。 散列技术是一种存储方法,也是一种查找方法。 0x02.如何构造哈希函数 遵循的原则: 计算简单 散列地址分布均匀 常用方法: 随机数法:选择一个随机函数,取关键字的随机函数值为它的哈希地址。即H(key)=random(key),其中random为随机函数。适用于关键字长度不等时。 除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址(p为素数) 折叠法:将关键字分割成位数相同的几部分(最后一部分的位数可不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。适用于关键字位数比较多,且关键字中每一位上数字分布大致均匀时。 平方取中法:取关键字平方后的中间几位为哈希地址。

Javascript与数据结构之栈结构

允我心安 提交于 2020-02-24 01:03:43
文章目录 栈结构 基础知识 栈结构的实现 栈的应用 栈结构 基础知识 相关特性 栈结构是一种特殊的数组,普通的数组可以在任意位置插入和删除元素,但是栈结构不可以,栈结构每次仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对的,把另一端称为栈底。进栈与出栈遵循LIFO(last in first out),后进入的元素最先出栈。类似于自动托盘,最后放上的托盘,往往先拿出去使用。 生活中类似于栈的: 处理邮件:最新到的最先处理的 家中取碗 栈在程序中的使用:函数调用栈 举例:函数A调用B,B中又调用C,C中又调用D 在执行过程中,会先将A压入栈,A没有执行完所以不会出栈,在A中调用B,便会将B压入栈顶,并执行B函数,当B调用C时,又将C压入栈顶,执行函数C,当C调用D时,又将D压入栈顶,执行函数D。直到D函数执行完毕后将函数D弹出,继续执行在栈顶的C函数。然后再执行B函数以及A函数。 专业术语 进栈:把新元素放到栈顶元素的上面,使之成为新的栈顶元素(又称入栈或压栈) 出栈:把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 栈结构的实现 function Stack ( ) { //相关属性 this . item = [ ] ; //相关方法 //1.将元素压入栈 Stack . prototype . push = function ( element ) { this .

数据结构栈的java实现

筅森魡賤 提交于 2020-02-23 19:42:56
近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。 实现方式是这样的:首先定义了一个接口,然后通过这个接口实现了线性栈和链式栈,代码比较简单,如下: 1 package com.peter.java.dsa.interfaces; 2 3 /** 4 * 栈操作定义 5 * 6 * @author Peter Pan 7 */ 8 9 public interface Stack<T> { 10 /* 判空 */ 11 boolean isEmpty(); 12 13 /* 清空栈 */ 14 void clear(); 15 16 /* 弹栈 */ 17 T pop(); 18 19 /* 入栈 */ 20 boolean push(T data); 21 22 /* 栈的长度 */ 23 int length(); 24 25 /* 查看栈顶的元素,但不移除它 */ 26 T peek(); 27 28 /* 返回对象在栈中的位置 */ 29 int search(T data); 30 } View Code 线性栈:以数组的方式实现。 1 package com.peter.java.dsa.common; 2 3 import com.peter.java.dsa.interfaces

紫薇星上的数据结构(4)

♀尐吖头ヾ 提交于 2020-02-23 19:36:34
昨天整理了链表的知识点,可以发现不管是单链表、循环链表、静态链表还是双向链表,原理都差不多,大家要多敲几遍代码。今天我们来整理 栈和队列 的知识点并做一个小实例看一下。 4.1初识栈 栈(stack)是限定仅在表尾插入和删除操作的线性表,允许插入和删除的一端称为“栈顶(top)”,另一端称为“栈底(bottom)”,不含任何数据元素的栈被称为空栈; 栈的特点:先进后出、后进先出。 注意: 栈又被称为后进先出(Last In First Out)结构的线性表,简称LIFO结构; 栈的插入操作,称为进栈,也称压栈、入栈(push); 栈的删除操作,称为出栈,也成为弹栈(pop)。 可以将栈想象为一口井,入栈就是往井里扔东西,每扔一个都会落在前一个的上面,出栈就是从井里取东西,取的时候只能从最上面的开始取。那么当我们初始化一个栈时,栈顶和栈底都是一样的,当开始入栈的时候栈顶就会移动到入账的数据处,而出栈时也会从栈顶数据开始取出。 栈的抽象数据类型 ADT 栈 (Stack) Data 栈的数据对象集合为{a1, a2, a3, ..., an},每个元素的类型均为DataType。其中,除第一个元素a1外,每个元素有且只有一个 直接前驱元素,除了最后一个元素an外,每个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。 Operation initStack(*S);

js视角的数据结构和算法(三)

倖福魔咒の 提交于 2020-02-23 18:22:36
js视角的数据结构和算法(三) 栈 队列 栈和队列的应用 树 二叉树 二叉树的实现 二叉搜索树/二叉查找树/二叉排序树 二叉树的遍历 栈 栈是逻辑结构中线性结构中的一种,遵循先入后出的原则。 最先入栈的元素称为栈底元素,最后入栈的元素称为栈顶元素。 栈属于逻辑结构,需要依托物理结构而存在。通过数组和链表,都可以实现一个栈。 栈基本操作是入栈和出栈,只从某一侧进行入或出,不论是链表实现还是数组实现,时间复杂度都是O(1)。 //入栈 var arr = [ 1 , 2 , 3 , 4 ] arr . push ( 5 ) //出栈 var arr = [ 1 , 2 , 3 , 4 ] arr . pop ( ) 队列 队列也是逻辑结构中线性结构中的一种,遵循先入先出的原则。 队列就像排队一样,有队头(出口)和队尾(入口)。 队列基本操作是入队和出队,只从某一侧进行入或出,不论是链表实现还是数组实现,时间复杂度都是O(1)。 //入队 var arr = [ 1 , 2 , 3 , 4 ] arr . push ( 5 ) //出队 var arr = [ 1 , 2 , 3 , 4 ] arr . shift ( ) 栈和队列的应用 先入后出的栈和先入先出的队列在特点上决定了它们的不同应用场景。 栈可用于历史数据的获取,是一种回溯,也能用于将递归操作转换成基于栈的非递归。

数据结构 之 二叉排序树

和自甴很熟 提交于 2020-02-23 16:23:27
1、什么是二叉排序树 二叉排序树 又叫(排序树 搜索数)他是一个一棵空树,或者是一棵具有如下性质的树: 1)若左子树不为空,那么左子树上面的所有节点的关键字值都比根节点的关键字值小 2)若右子树不为空,那么右子树上面的所有节点的关键字值都比根节点的关键字值大 3)左右子树都为二叉树 4)没有重复值(这一点在实际中可以忽略) 2、如何遍历 二叉树中序遍历,先访问左节点,然后访问中间节点,然后在访问右节点 如上图 中序遍历一个树, 1、先访问根节点的左子树 12 ,它有左子树? 有 --> 结果: 2、访问 12 的左子树 9 ,它有左子树? 没有 --> 结果:9 3、它有右子树? 没有,访问上一级 --> 结果:9 12 4、12 是否有右子树 ? 有 , 访问 40 --》 结果: 9 12 5、 40是否有左子树? 有, 访问 35 ,且35 没有左子树 --> 结果: 9 12 35 6、 检查35 是否有右子树? 没有 , 访问它的根节点 --》 结果: 9 12 35 40 7、检查 40 是否有右子树? 有,访问 190 ,它有左子树 8、访问它的左子树 146, 检查它有左子树? 没有 —》 结果: 9 12 35 40 146 9、检查它有右子树? 无 , 访问它的父节点 190 --》 结果 : 9 12 35 40 146 190 10、 检查190

究竟是什么在影响我们的性能

三世轮回 提交于 2020-02-23 15:14:31
前言 注:这里讨论的场景在于MIS,OA一类的系统 大部分同学在看到这个问题的时候,第一反应是糟糕的SQL语句,没有加索引,这甚至已经成为一种惯性思维。 当发现性能出问题的时候,一般都会想到加个索引,或者改造下连接方式,去掉“not exists”诸如此类,但效果往往不太理想,或过一段时间后,效果又不理想了,此时,一般大家都会觉得问题在于自己还不是大神。 正文 今天给大家分享的就是:为了提高性能,不是大神的我们还有多少方法可以采取? 性能有三大杀手:1)糟糕的SQL使用;2)糟糕的数据结构;3)糟糕的业务模型 下面举一个实际的例子,在EPO物资采购系统中的需求跟踪功能中,可以查询到所有历史提交的需求申请单。查询包含从需求申请->需求受理->订单->验收入库->通知领用->发放完成所有环节的状态。最初的做法是通过join将需求表、需求受理表、订单表、验收表、领用通知表和发放表连接起来形成一张视图。当数据量小的时候,看起来一切都是那么的完美,但是后来就不那么美好了。于是,后来我们采取了一系列的优化。 阶段一:物化视图 当join的时候,问题出现在join的计算过程,数据量大了,计算耗费就会大,性能便会下降。不过,当问题来的那天,对于这种问题,大家是非常坦然的面对,做一张物化视图就可以了,每天晚上计算一下,第二天查询物化视图即可。利用原生的SQL功能,物化视图,对于大家来说手到擒来

数据结构:线性表

时光怂恿深爱的人放手 提交于 2020-02-23 11:04:48
线性表设计与实现 线性表基本概念 线性表定义 线性表(List)是零个或多个数据元素的集合 线性表中的数据元素之间是有顺序的 线性表中的数据元素个数是有限的 线性表中的数据元素的类型必须相同 数学定义 线性表是具有相同类型的 n( ≥ 0)个数据元素的有限序列(a1, a2, …, an)ai是表项,n 是表长度。 性质 a0为线性表的第一个元素,只有一个后继 an为线性表的最后一个元素,只有一个前驱 除a0和an外的其它元素ai,既有前驱,又有后继 线性表能够逐项访问和顺序存取 练习 下面的关系中可以用线性表描述的是 A.班级中同学的友谊关系 B.公司中的上下级关系 C.冬天图书馆排队占座关系 D.花名册上名字之间的关系 线性表的操作 创建线性表 销毁线性表 清空线性表 将元素插入线性表 将元素从线性表中删除 获取线性表中某个位置的元素 获取线性表的长度 线性表在程序中表现为一种特殊的数据类型 线性表的操作在程序中的表现为一组函数 C语言描述=====》线性表的设计与实现 #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且返回一个空的线性表 List* LinkList_Create(); //销毁一个线性表list void List_Destroy