当前位置: 首页 > news >正文

数据结构-栈、队列、哈希表

1栈

1.栈的概念
1.1栈:在表尾插入和删除操作受限的线性表
1.2栈逻辑结构: 线性结构(一对一)
1.3栈的存储结构:顺序存储(顺序栈)、链表存储(链栈)
1.4栈的特点:
先进后出(fisrt in last out FILO表),后进先出

//创建栈   
Stacklist create_stack()
{
        Stacklist list=(Stacklist)malloc(sizeof(stack_t));
        if(NULL==list)
        return NULL ;

        memset(list->data,0,sizeof(list->data));
        list->top=-1;
        return list;
}

  //入栈                                                                                  
 int push(datatype element,Stacklist list)
{
        //1判断栈满
        //2判断栈创建失败
        if(list==NULL||list->top==MAXSIZE-1)
        {
                return FALSE;
        }
        //3入栈,先加后压
        list->data[++list->top]=element;
        return SUCCESS;
}
//输出
int output(Stacklist list)
{
        //1判空
        //2判断创建失败
        if(list==NULL||list->top==-1)
        {
                return FALSE;
        }
        //3打印
        for(int i=0;i<list->top;i++)
        {
        printf("%.2f\n",list->data[i]);
        }
        putchar(10);
        return SUCCESS;
}
//出栈
int pop(Stacklist list)
{

        //1判空
        //2判断创建失败
        if(list==NULL||list->top==-1)
        {
                return FALSE;

        }
        printf("pop data is %.2f\n",list->data[list->top--]);
        return SUCCESS;
}

2队列

1.队列的概念
1.队列: 在表尾插入,表头删除的操作受限的线性表
2.逻辑结构:线性结构(一对一)
3.存储结构:顺序存储(顺序队列(假溢出)(循环队列)),链式存储(链式队列)
4.队列的特点:先进先出(fisrt in first out FIFO表),后进后出

Queue create_queue()
{       Queue list=(Queue)malloc(sizeof(queuelist_t));
        if(NULL==list)
        return NULL;
        //初始化
        memset(list->data,0,sizeof(list->data));
        //队头队尾初始化
        list->front=list->rear=0;
        return list;
}
        //队列的插入
int enqueue(datatype element,Queue list)
{
        //判断队列是否创建
        //判断队列是否满
        if(NULL==list||list->rear==MAXSIZE)
        return FALSE;
        //3.插入在队尾部
        list->data[list->rear]=element;
        list->rear=(list->rear+1)%MAXSIZE;
        return SUCCESS;
        }
//队列的输出
int output(Queue list)
{
        //判断队列是否为空
        //判断队列是否创建
        if(NULL==list||list->front==list->rear)
        return FALSE;
        //3.循环打印对头--》队为的元素
        for(int i=list->front;i<list->rear;i=(i+1)%MAXSIZE)
        {
                printf("%d",list->data[i]);

        }
        putchar(10);
        return SUCCESS;
} //队列的删除
int delqueue(Queue list)
{
        //判断队列是否为空
        //判断队列是否创建
        if(NULL==list||list->front==list->rear)
        return FALSE;
        //3.删除在对头
        printf("delqueue data is %d n",list->data[list->front]);
        list->front=(list->front+list->rear)%MAXSIZE;
        return SUCCESS;
}
//计算队列长度
int get_len(Queue list)
{
return (MAXSIZE-list->front+list->rear)%MAXSIZE;
}

3哈希表

1.哈希表的概念
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

除留余数法:
取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址的方法
H(key)=key MOD p (p<=m)
m: 元素的个数除以3/4
p一般取不大于表长m的最大质数

3.哈希冲突
1.哈希冲突:不同的关键码值通过哈希函数映射在同一片内存
2.线性探测法: di=1,2,3,...,m-1,即从冲突地址向后依次查找空闲地址的处理冲突方法
3.二次探测法: di=1²,-1²,2²,-2²。。.(km/2) 即从冲突地址向前后以整数二次方为增量查找空闲地址的处理中冲突方法
4.伪随机探测法:di为确定的伪随机数序列(如3,5,8...,即将冲突地址加上序列中的伪随机数以查找空地址的处理冲突方法
5.再哈希法:在发生冲突时使用另一个哈希函数计算地址,直到不再发生冲突
6.链地址法:将所有哈希函数值相同的记录存储在同一线性链表中
7.建立公共溢出区:一旦发生冲突,都填入溢出表




//
//
Hashlist create_node()                                                                               
{       //1创建一个新节点
        Hashlist s=(Hashlist)malloc(sizeof(struct Node));                                            
        if(NULL==s)
        return NULL;
        //初始化新节点的数据域
        s->data=0;
        /初始化新节点的指针域                                                                        
        s->next=NULL:
        return s;                                                                                    
}     
//计算最大质数  
int max_prime(int m)                                                                                 
{
        for(int i=m;i>=2;i--)
        {
                int flag=0;                                                                          
                for(int j=2;j<=sqrt(i);j++)                                                          
                {                                                                                    
                        if(i%j==0)
                        {
                                flag=1;
                                break;
                        }
                }
                        if(flag==0)
                        return i;
        }
}
//插入
void insert_hash(int key,Hashlist hash[],int m)
{
        int p=max_prime(m);
        int sub=key%p;
        Hashlist head=hash[sub];//head
        Hashlist s=create_node():
        s->data=key;
        //1.判断链表为空
        if(head==NULL)
        head=s;
        //2.存在多个节点
        s->next=head;
        head=s;
        hash[ sub]=head;
}

相关文章:

  • PyTorch与TensorFlow的对比:哪个框架更适合你的项目?
  • 什么是动态IP?静态IP和动态IP有什么区别?
  • C++中std::condition_variable_any、std::lock_guard 和 std::unique_
  • UE5控件组件显示UMG文本不正常
  • 1、AI量化学习资料 - 用DEEPSEEK玩转PTrade策略开发.zip\AI量化学习资料 - 1、PTrade策略开发提示词(参考模板).md
  • SpringBoot速成(14)文件上传P23-P26
  • 【JAVA实战】JAVA实现Excel模板下载并填充模板下拉选项数据
  • 【C++】36.C++IO流
  • 级联选择器多选动态加载
  • 洛谷P11042 [蓝桥杯 2024 省 Java B] 类斐波那契循环数
  • Linux系统配置阿里云yum源,安装docker
  • Step-Video-T2V:阶跃星辰发布最强开源视频生成模型(论文详解)
  • 《深度学习》——ResNet网络
  • 单纯禁用Cookie能否保证隐私安全?
  • 跳表的C语言实现
  • MySQL5.7 创建用户并授予超管权限脚本
  • uni-app发起网络请求的三种方式
  • 探讨如何加快 C# 双循环的速度效率
  • 【route】route add命令详解
  • 记一次一波三折的众测SRC经历
  • 上海青少年书法学习园开园:少年以巨笔书写《祖国万岁》
  • 孟夏韵评《无序的学科》丨误读与重构的文化漂流
  • 工人日报:应对“职场肥胖”,健康与减重同受关注
  • 特朗普公开“怼”库克:苹果不应在印度生产手机
  • 韩正会见美国景顺集团董事会主席瓦格纳
  • “家国万里时光故事会” 举行,多家庭共话家风与家国情怀