栈
栈是只允许在一端进行插入、删除的线性表
栈的操作有init,Top,Pop,Empty,Push
栈的运算以及栈的存储实现
因为栈也是线性表,所以链表以及顺序表的存储原理对栈同样适用,栈只是在操作上收到了先进后出的限制
同理栈分为顺序栈以及链栈,他们的运算同理与顺序表以及链表,不再详细说明
栈顶p->top
栈的经典案例有迷宫、进制转换、运算等
队列
队列是只允许在一端进另一端出的线性表
队列的操作有 in,out,init,empty,front
队列分为顺序队列,链队列
队列的出队入队会产生假溢出,使用循环队列解决假溢出问题
队列头指针p->front;尾指针p->rear
迷宫问题也可以用队列实现
串
串即字符队列
查找子字符串出现次数
int string_find( char str[], char substr[] )
{
int i, j, check ,count = 0;
int len = strlen( str );
int sublen = strlen( substr );
for( i = 0; i < len; i++ ){
check = 1;
for( j = 0; j + i < len && j < sublen; j++ ) {
if( str[i + j] != substr[j] ){
check = 0;
break;
}
}
if( check == 1 ){
count++;
i = i + sublen;/*调整检测起始位置*/
}
}
return count;
}
KMP算法比较
int KMP(stringW,stringT){
int i=1,j=1;
int n=strlen(stringW);
int m=strlen(stringT);
while(i<=n){
while(j!=0&&W[j]!=T[i]){
j=next[j];
}
if(j==m){
return i-m+1;
}else{
j++;
i++;
}
}
return -1;
}
void GetNext(stringW){
m=strlen(stringW);
for(int i=1; i<m; i++){
int j=i;
while(j>0){
j=next[j];
if(W[j]==W[i]){
next[i+1]=j+1;
break;
}
}
}
}
串的堆存储结构
1)带串长度的索引表 名字、长度、地址
2)末尾指针的索引表 名字、s’tartadr,endadr
3)带特征位的索引表 name, tag, value/adr
数组
数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的一组下标来标识,因此,在数组上不能做插入、删除数据元素的操作。当然在脚本语言中数组是可以乱来的
数组是一种变种的线性结构
C语言中数组的操作
(1) 取值操作:给定一组下标,读其对应的数据元素。
(2) 赋值操作:给定一组下标,存储或修改与其相对应的数据元素。
矩阵
矩阵可以用数组来表示,在存储是可以对三角矩阵,对称矩阵,带壮矩阵进行压缩存储
稀疏矩阵三元组(i,j,v)与十字链表的存储方式进行压缩存储
广义表
广义表可以看成是一个不规则的多维数组,常规线性表是广义表的特例
二叉树
这部分就不详述了 都很熟了
列一个概要
完全二叉树 满二叉树
二叉树的存储结构分为链存储和表存储
二叉树的遍历分为:
先序: 中左右
中序:左中右
后序:左右中
按层遍历
void LevelOrder(BiTree bt){
BiTree Queue[MAXNODE];
int front,rear;
if (bt==NULL) return;
front=-1;
rear=0;
queue[rear]=bt;
while(front!=rear){
front++;
Visite(queue[front]->data); /*访问队首结点的数据域*/
if (queue[front]->lchild!=NULL) {
rear++;
queue[rear]=queue[front]->lchild;
}
if (queue[front]->rchild!=NULL) {
rear++;
queue[rear]=queue[front]->rchild;
}
}
}
先序遍历
void PreOrder(BiTree bt){
if (bt==NULL) return;
Visite(bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
由先序与中序反推复原二叉树
void PreInOd(char preod[ ],char inod[ ],int i,j,k,h,BiTree *t){
* t=(BiTNode *)malloc(sizeof(BiTNode));
*t->data=preod[i];
m=k;
while (inod[m]!=preod[i]){
m++;
}
if (m==k) {
*t->lchild=NULL
}else {
PreInOd(preod,inod,i+1,i+m-k,k,m-1,&t->lchild);
}
if (m==h){
*t->rchild=NULL;
}else{
PreInOd(preod,inod,i+m-k+1,j,m+1,h,&t->rchild);
}
}
非递归方式实现二叉树的遍历可以通过以下方式
1)栈
2)三叉链表
3)反转链
4)线索二叉树
哈夫曼二叉树 带权路径最小
平衡二叉树 左右叶子深度差不超过1
树与森林的遍历
B+、B-树
二叉排序树
二叉树与树以及森林之间的互相转化
树的存储方法:双亲表示,孩子表示,孩子兄弟表示,孩子双亲表示 怎么能找到祖宗 怎么能找到族谱怎么行
图
有向图,无向图,完全图 ,稠密图,稀疏图,
边,弧,顶点度,入度,出度,边的权、网图,
回路、简单路径、简单回路,子图,连通图、连通分量,强连通图、强连通分量
图的存储方式
1)邻接矩阵
2)邻接表
3)十字链表
4)邻接多重表
图的遍历
1)深度优先遍历 类似树的先序遍历
2)广度优先遍历 类似树的层次遍历
生成树和森林
最短路径
最小生成树
图的应用主要应用于需要拓扑结构的地方 比如网络
树主要应用于文件系统 ,判断,运算,集合运算