嵌入式第二十天

复习:
栈:先进后出 后进先出 操作栈顶

struct stack
{
    typename data[N];
    int top;
}

init 
push
pop 

一、队列:先进先出 后进后出  可以操作队列两端
1.数组队列  链队列
2.循环队列
    #include<stdio.h>
    #include<stdlib.h>
    #define FULL -1
    #define EMPTY -2 
    #define SUC 0
    #define N 3
    typedef struct queue
    {
        int rear;//队列的尾下标  入队
        int front;//队列头下标  出队
        int data[N];
    }queue_t;

    queue_t * init_queue()
    {
        queue_t *p=(queue_t*)malloc(sizeof(queue_t));
        if(NULL==p)
        {
            puts("malloc failed");
            exit(-1);
        }
        p->rear = 0;
        p->front = 0;
        return p;
    }

    int is_full(queue_t *q)
    {
        
        return ((q->rear+1)%N==q->front);  //判断队列是否为满
        
    }
    int in_queue(queue_t*q,int x)//入队列
    {
        if(is_full(q))
        {
            //puts("full");
            return FULL;
        }
        q->data[q->rear] = x;
        q->rear = (q->rear+1)%N;//1 
        
        return SUC;
        
    }

    int is_empty(queue_t *q)//判断是否为空
    {
        return (q->front==q->rear);
    }
    int out_queue(queue_t *q,int *pout)//出队列  pout=&out_data  *pout-->out_data
    {
        if(is_empty(q))
        {
            puts("empty");
            return EMPTY;
        }
        *pout = q->data[q->front];
        q->front = (q->front+1)%N;
        
        return SUC;
    }
    int main()
    {
        int out_data;
        queue_t *q=NULL;
        q = init_queue();    
        in_queue(q,10);
        in_queue(q,20);
        
        out_queue(q,&out_data);
        printf("%d\n",out_data);
        
        out_queue(q,&out_data);
        printf("%d\n",out_data);
        
    }

二、快速排序
冒泡排序改进版 使用的是递归原理 目前最快方法 
分而治之的一种排序方式

思路:
1.取第一个数据作为标旗 flag 
2.比较排序 实现flag左侧比它小 右侧比它大
3.先排flag的某一侧  重复1 2 

细节:

#include<stdio.h>
#define N 5
void swap(int *parr,int low,int high)
{
    int tmp;
    tmp = parr[low];
    parr[low] = parr[high];
    parr[high] = tmp;
}
int sort(int *parr,int low,int high)
{
    int flag = parr[low];
    while(low<high)
    {
        while(parr[high]>=flag&&low<high)//12  12  13 56 78 
        {
            high--;
        }
        if(low==high)
        {
            return low;
        }
        swap(parr,low,high);
        low++;
        
        while(parr[low]<=flag&&low<high)
        {
            low++;
        }
        
        if(low==high)
        {
            return low;
        }
        swap(parr,low,high);
        high--;
    }
    
    
    return low;
}

void quick_sort(int *parr,int low,int high)
{
    int ret = sort(parr,low,high);//细节 每一趟是怎么比较交换的
    if(ret+1<high)//先排右侧
    
    {
        quick_sort(parr,ret+1,high);
    }
    if(low<ret-1)
    {
        quick_sort(parr,low,ret-1);
    }
}

void out_arr(int *p)
{
    int i;
    for(i=0;i<N;i++)
    {
        printf("%d ",p[i]);
    }
}
void input_arr(int *p)
{
    int i;
    for(i=0;i<N;i++)
    {
        scanf("%d",&p[i]);
    }
}
int main()
{
    int arr[N];
    //int arr[]={12,3,5,9,41,11,27,23,45,7,10};
    puts("the num of integer:");
    input_arr(arr);
    quick_sort(arr,0,N-1);
    out_arr(arr);
}

三、hash查找 哈希
应用:海量数据存储查找

    1.区域划分的方法-算法
    2.根据方法摆放书架
    3.将书存入书架

    4.用户输入书名  按照之前方法对书名处理 找到书位置


hash算法:
  1.哈希公式
  2.根据哈希公式创建哈希表--数据库
  3.将数据进行哈希处理(哈希公式处理) 存入哈希表
  4.用户输入数据 程序负责根据哈希公式将数据进行哈希处理 找数据

  例子1:
  1  1000 
  2  3000
  3  5000
  4  10000
  。。。。
  135  10    

    #include<stdio.h>

    int hash_fun(int age)
    {
        return age-1;
    }  
    void save_message(int *parr,int age,int num)
    {
        parr[hash_fun(age)] = num;
    }

    int find_message(int *parr,int find_age)
    {
        return parr[hash_fun(find_age)];//
        
    }
    int main()
    {
        
        int arr[135]={0};
        int age,num,i=0,find_age;
        while(i<3)//键入输入要存储的年龄及人数
        {    
            //输入 age num
            puts("please input age  num:");
            scanf("%d%d",&age,&num);
            save_message(arr,age,num);
            i++;
        }
        
        //用户输入要查询的年龄
        puts("please input the age you find:");
        scanf("%d",&find_age);
        //查询
        printf("%d\n",find_message(arr,find_age));
        
        
    }


    例子2:保留余数
    冲突
    
    int main()
    {
        int arr[]={5,6,17,22,13,58,9,15,20,7};    
        int hash_arr[10]={0};
        int bak_arr[9]={0};
        save_message(arr,hash_arr,bak_arr);
        
        //用户输入数据 
        find_message(hash_arr,bak_arr,find_data);
    }

    作业1:队列
    QQ   631758924
    615947283
    
    作业2:对于一个字符串 可能含有‘a’-'z' 中的多个字符 字符可以重复 
    char a[]="abdsdsaavdxaaacd";
    编写程序  对于这样一个字符串 输出字符串出现次数最对的字符 以及出现的次数
    ‘a’ 6
    ‘b’ 1
    'c' 1
    
    ch-'a'
    


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值