数据结构(二)

栈是只允许在一端进行插入、删除的线性表
栈的操作有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)广度优先遍历 类似树的层次遍历

生成树和森林
最短路径
最小生成树

图的应用主要应用于需要拓扑结构的地方 比如网络
树主要应用于文件系统 ,判断,运算,集合运算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值