数据结构
zhlei12345
这个作者很懒,什么都没留下…
展开
-
中缀表达式转变成后缀表达式
我们这里只针对加减乘除运算的表达式进行转变。中缀表达式就是正常的表达式,例如a+b*c+(d*e+f)*g。我们需要将它转变成后缀表达式,也就是符号在数字后面。转变规则就是如果遇到数字,就输出数字,如果遇到符号,比较这个符号和栈中的符号优先级的高低,如果这个符号优先级高,就压入栈中,反之,现将栈顶符号输出,再进行比较,决定是否输出符号。如果遇到左括号,它的优先级最高,只有碰到右括号,才将左括号弹出。原创 2015-04-22 16:12:32 · 590 阅读 · 0 评论 -
哈希表基础知识(3)
\quad\quad在哈希表基础知识(1)和(2)中我们介绍了两种哈希表表示方法,分离链接法和开放地址法,但是这些都是针对数据可以存储到内存中的数据而言的操作,如果数据量过大,不能存进内存,也就是说我们需要解决磁盘上的检索数据问题。 \quad\quad我们假设每个磁盘区块上可存储的数据是有限的,如果我们用分离链接法或者是开放地址法的话,那么在查找数据的时候我们是需要对多个磁盘区块进行考察的。这样原创 2015-04-27 16:01:14 · 460 阅读 · 0 评论 -
优先队列基础知识(四)---二项队列
本文主要分析二项队列。这个优先队列结构也是为了处理对数时间合并两个优先队列而提出来的。它可是保证平均插入时间为常数。同时合并,删除最小元操作的最坏时间为O(logN)O(logN)。这比左式堆更优,左式堆和斜堆是没办法实现平均插入时间是常数时间的。原创 2015-05-11 09:24:18 · 471 阅读 · 0 评论 -
编写查找一个单链表特定元素的程序
我们分成递归和非递归两种方法来实现。原创 2015-04-28 22:44:26 · 1608 阅读 · 0 评论 -
优先队列基础知识(一)
本文主要复习优先队列的相关知识。运用二叉堆数据结构实现优先处理队列中的较小元素(当然也可以是其他的元素)。所谓二叉堆,其几何形状就是完全二叉树。这样的话,我们就可以用数组来实现二叉堆,原因就是一个节点i的子节点就是2i和2i+1,一个节点的父节点就是i/2取整数部分。这样就避免了使用指针来寻找二叉树中的位置,加快了搜寻速度。原创 2015-04-30 10:52:39 · 422 阅读 · 0 评论 -
优先队列(二)
本文主要探索一下优先队列的其他的一些操作,这些操作涉及到二叉堆中某个元素的处理,因此必须首先找到指定元素的位置。但是我们知道在一个给定的最小元素二叉堆中(也就是堆顶元素是最小值),寻找一个元素(如果不是最小元素)是必须遍历这个二叉堆的,所需的时间就是线性时间。 本文主要把散列表和二叉堆结合起来,通过散列表,用常数时间找到某个元素在二叉堆中的位置。原创 2015-05-01 22:34:11 · 381 阅读 · 0 评论 -
排序算法
本文主要回顾基本的排序算法。内容包括算法的基本描述,算法的实现,算法的时间复杂度分析三个部分。原创 2015-05-11 22:13:15 · 505 阅读 · 0 评论 -
不相交集ADT
首先我们必须明白不相交集这种数据结构是用来干什么的。不相交即主要用来实现动态等价问题的求解。动态等价问题\textbf{动态等价问题} \quad\quad这里不再说明等价关系的概念,这个可以参考数理逻辑之类的书。假设我们有一个集合和一个等价关系~,针对集合中的任意两个元素aa和bb,我们如何确定他们有等价关系~,即a~b.那么我们需要等价类的概念,一个元素a∈Sa \in S原创 2015-05-18 19:04:52 · 771 阅读 · 0 评论 -
图论算法的基础知识
图的表示\large\textbf{图的表示} \quad\quad如果有向图是稠密的,也就是图中的边数|E||E|和定点数|V||V|满足如下关系|E|=O(|V|2)|E|=O(|V|^2)。那么我们就用二维数组来表示,如果有向图是稀疏的,也就是边数相当的少,那么我们就用邻接表来表示。它就是一个结构体数组,每个元素表示一个顶点,然后指向它的所有相邻的顶点(这个相邻是指出边)。 \quad\q原创 2015-06-05 20:10:00 · 3178 阅读 · 0 评论 -
优先队列基础知识(三)---左式堆
本文主要就是介绍这样的堆数据结构---左式堆,实现对数时间的合并操作。原创 2015-05-08 17:17:40 · 1430 阅读 · 0 评论 -
哈希表基础知识(hash table)(1)
本节主要结束散列表的相关内容。散列是一种用以常数平均时间执行插入,删除,和查找的技术。但是那些需要元素间任何排列信息的操作将不会得到有效的支持,比如查找最小值,以线性时间按排序顺序将整个表打印出来的操作都不是散列表所支持的。 针对哈希表,我们需要注意两点,1.哈希函数的确定。本章节用Horner法则来获得哈希函数。2.解决哈希冲突。本章节主要通过分离链接法来实现原创 2015-04-25 10:59:10 · 598 阅读 · 0 评论 -
哈希表基础知识(2)
在散列表基础知识(1)中,我们介绍了分离链接法来解决哈希冲突。它的一个缺陷就是需要经常的分配动态内存,这是比较花费时间的。本文再介绍解决散列表的另外一种方法开放定址法。不需要多次的动态分配内存。原创 2015-04-27 11:15:55 · 1165 阅读 · 0 评论 -
链表基础学习(一)
本文主要回顾数据结构中的链表的操作,包括链表的构造和基本操作函数首先是在头文件中申明所要用的结构体以及链表基本操作函数#ifndef _list_H#define _list_H//声明一个结构struct Node;typedef struct Node *pnode;typedef pnode List;typedef pnode Position;List makeempty(Li原创 2015-04-13 13:10:59 · 445 阅读 · 0 评论 -
链表基础学习(二)
本文主要介绍双向链表的构造以及基本操作 头文件#ifndef double_H_#define double_H_struct dnode;typedef struct dnode *dlist_point;typedef dlist_point Dlist;typedef dlist_point Position;//插入函数void Insert1(Dlist L,Positio原创 2015-04-14 11:19:11 · 287 阅读 · 0 评论 -
栈基础学习
本文主要针对栈的实现进行学习 首先是头文件,声明所要用的函数和结构体#ifndef stack_H_#define stack_H_struct Stacks;typedef struct Stacks *Stack;//创建一个空栈Stack create(int scale);//判断是否为空栈int Isempty(Stack S);//Pushvoid Push(Sta原创 2015-04-14 22:16:44 · 432 阅读 · 0 评论 -
二叉查找树
使得二叉树成为二叉查找树的关键就是令树中的每个节点的左子树的关键值小于X的关键值,它的右子树中所有的关键字大于X的关键字。 本文主要介绍二叉查找树的实现和基本的插入和删除操作 头文件声明如下#ifndef ADT_H_#define ADT_H_struct ADT;typedef struct ADT *ADtree;typedef struct ADT *Position;//查找原创 2015-04-16 22:33:36 · 370 阅读 · 0 评论 -
二叉平衡树
本文主要介绍二叉平衡树的定义以及它的插入节点工作。 头文件的定义#ifndef AVL_H_#define AVL_H_struct AVL;typedef struct AVL *Search_tree;typedef struct AVL *Position;int Max(int x,int y);Search_tree create();void print(Position原创 2015-04-17 21:21:09 · 448 阅读 · 1 评论 -
X+Y返回格式
练习:写一个函数,把两个正整数数相加后,返回结果,这个结果每三位加一个逗号,为了简单起见,这些数范围为(0,1000000).#include <stdio.h>原创 2015-04-17 22:50:39 · 412 阅读 · 0 评论 -
计算后缀表达式(一)
本节主要计算简单的后缀表达式的值,数据是0-9,只有‘+’,‘-’,‘*’,‘/’,四种运算。计算的基本方法就是用栈来处理,遇到数字,就将数字压入栈中,遇到运算符,就将栈中的前两个数字做相应的运算,然后退两次栈,再把计算过的数字压入栈中。最终输出栈顶元素。原创 2015-04-25 10:07:50 · 496 阅读 · 0 评论 -
两个多项式相加
习题1(链表) 编写将两个多项式相加的函数。不要毁坏输入数据。如果这两个多项式分别有M项和N项,那么你的程序的复杂度是多少。原创 2015-04-24 22:02:49 · 2065 阅读 · 0 评论 -
表达树的基础知识
表达式树的树叶是操作数,比如常量或者是变量,二其他的节点为操作符,我们在这里限制操作符都是二目的。原创 2015-04-16 18:04:57 · 421 阅读 · 0 评论