摘要:
二叉树的非递归遍历 #include<stdio.h> #include<stdlib.h> #include"myStack.h" //使用数组形式的栈 //非递归遍历可以使用下列规则 /* 每个节点设置一个标志位,默认状态为假 - 将根节点压入栈中 - 进入循环:只要栈中元素个数大于0,进行循环 阅读全文
摘要:
笔记 树 多叉树转换成二叉树:左孩子右兄弟 从根节点、左下方开始,节点左侧放自己左侧的孩子,右侧放自己右侧的兄弟。 二叉树 满二叉树 一颗深度为k且有(2的k次方减1)个节点 完全二叉树 除最后一层外,每一层上的节点数均达到最大值;在最后一层只缺少右边的若干节点。 示意图 遍历 先序遍历:根 左 右 阅读全文
摘要:
笔记 和顺序存储类似,使用链表来表示队列。入队即是尾插,出队即是头删。 队头即是链表第一个元素,获取队尾就需要遍历next指针找到最后一个节点。 代码 myQueue.c #include"myQueue.h" #include"myLinkList.h" //这里使用用户维护指针的链表写法 #in 阅读全文
摘要:
笔记 队列是一种先进先出的线性表,它只能从队尾插入数据,从队首获取数据。 使用动态数组来存储队列,入队即是尾插,出队即是头删,获取队头即是数组的第一个元素。 需要实现的接口 初始化、入队、出队、获取队头、获取队尾、队列大小、销毁队列 代码 myQueue.c #include"myQueue.h" 阅读全文
摘要:
笔记 栈-链式存储 使用链表的方式存储栈的指针数据,将栈顶设置在链表头部 入栈就相当于头插、出栈相当于头删 size记录栈的大小,数据预留出4字节用来存储指针 代码 myStack.c #include"myStack.h" #include<stdlib.h> //使用链表的方式存储栈的指针数据, 阅读全文
摘要:
/* 中缀转后缀、再计算后缀表达式 中缀转后缀规则 遍历中缀表达式: 数字:直接输出 括号:左括号:入栈 右括号:将栈顶符号出栈并输出,直到匹配到左括号,将左右括号舍弃 符号:与栈顶符号进行优先级比较 若栈顶符号优先级低:此符号入栈(默认左括号的优先级最低) 若栈顶符号优先级高:将栈顶符号出栈并输出 阅读全文
摘要:
代码 #include"myStack.h" #include<stdlib.h> #include<stdio.h> #include<string.h> //使用了数组形式的栈 /* ((5+6)/2)+(4+7)/3) 这样一串字符串,分辨出括号是不是成对 判断字符,是左括号入栈,右括号出栈 阅读全文
摘要:
笔记 栈是一种先进后出的存储结构 结构示意图 使用顺序存储-数组形式 利用数组来存储栈,数组尾部做栈顶,栈的size记录当前栈内元素个数,也指示当前栈顶在数组的哪个位置。 利用一个结构体来管理栈,成员为size和一个元素为void指针的数组。栈只存储指向数据的指针,所以也要注意数据的作用域。 要实现 阅读全文
摘要:
笔记 另一种形式的单向链表 节点结构体并不存储数据,只有一个next指针元素。然后约定好数据结构体预留四个字节(结构体定义时的最上方,地址的低四字节)。当数据指针和节点指针互相转换时,next元素就映射至数据预留的四字节,即可用来做指针指向下一节点。这样可以让数据和链表更分离,链表可以不再维护数据。 阅读全文
摘要:
笔记 链表是一种线性的链式存储结构,可以不用事先确定节点的个数,插入删除节点需要的操作量较少。但只能通过遍历链表来查找想找的节点。 每个节点用一个结构体表示,节点结构体内分成两部分(数据域、指针域)。指针域用来指向下一个节点、数据域存放数据。 单向链表需要维护一个头节点,之后所有的操作都需要通过头节 阅读全文
摘要:
笔记 实现一个可以动态申请内存的线性存储结构。例如在插入数据时判断容量是否够用,不够时申请一块更大的内存,将数据复制过去,然后释放之前的内存。 动态数组结构体.paddr(void **)指向一列(void*)的第一个,其中每个(void*)指向存放的数据 数据由用户自己维护,要注意可能会出现的作用 阅读全文