zoukankan      html  css  js  c++  java
  • 基本数据结构(C)

    栈:

    #include "stdio.h"
    #include "stdlib.h"
    #define MAX_SIZE 100
    typedef struct stack
    {
        int *base;
        int top;
    }Stack;
    int InitStack(Stack *stack)
    {
        stack->base=(int *)malloc(MAX_SIZE*sizeof(int));
        if(!stack->base) return -1;
        stack->top=0;
        return 1;
    }
    int IsEmpty(Stack *stack)
    {
        if(0==stack->top) return 1;
        return 0;
    }
    int IsFull(Stack *stack)
    {
        if(MAX_SIZE-1==stack->top) return 1;
        return 0;
    }
    int Push(Stack *stack,int e)
    {
        if(!IsFull(stack))
        {
            stack->base[stack->top]=e;stack->top+=1;
            return 1;
        }
        return -1;
    }
    int Pop(Stack *stack)
    {
        if(!IsEmpty(stack))
        {
            stack->top-=1;
            return stack->base[stack->top];
        }
        return -1;
    }
    void main()
    {
        int i=1;
        Stack *stack=(Stack *)malloc(sizeof(Stack));
        if(InitStack(stack))
        {
            while(i<=10)
            {
                Push(stack,i);
                i++;
            }
        }
        printf("栈中元素出栈(先进后出):\n");
        while(!IsEmpty(stack))
        printf("%d\t",Pop(stack));
    }

    队列:

    #include "stdio.h"
    #include "stdlib.h"
    #define MAX_SIZE 10//虽然容量是10,但注意该循环队列只能保存9个整数
    typedef struct queue
    {
        int *base;
        int rear;
        int front;
    }SqQueue;
    //初始化循环队列
    int InitQueue(SqQueue *sqqueue)
    {
       sqqueue->base=(int *)malloc(MAX_SIZE*sizeof(int));
       if(!sqqueue->base)return -1;
       sqqueue->rear=0;
       sqqueue->front=0;
       return 1;
    }
    //入队
    int EnQueue(SqQueue *sqqueue,int e)
    {
        if((sqqueue->rear+1)%MAX_SIZE==sqqueue->front)return -1;
        sqqueue->base[sqqueue->rear]=e;
        sqqueue->rear=(sqqueue->rear+1)%MAX_SIZE;
        return 1;
    }
    //获取对头元素
    int FrontQueue(SqQueue *sqqueue)
    {
        if(Empty(sqqueue))return -1;
        return sqqueue->base[sqqueue->front];
    }
    //出队
    int DeQueue(SqQueue *sqqueue)
    {
        int i=0;
        if(sqqueue->rear==sqqueue->front)return -1;
        i=FrontQueue(sqqueue);
        sqqueue->front=(sqqueue->front+1)%MAX_SIZE;
        return i;
    }
    //判断队列是否为空。注意空和满的条件
    int Empty(SqQueue *sqqueue)
    {
         if(sqqueue->rear==sqqueue->front)
            return 1;
         else
            return 0;
    }
    void main()
    {
        int i=1;
        SqQueue *sqqueue=(SqQueue *)malloc(sizeof(SqQueue));
        if(InitQueue(sqqueue))
        {
            while(i<=10)//最后一次入队失败。因为要损失一个空间存放尾指针
            {
                 EnQueue(sqqueue,i);
                 i++;
            }
    
    
        }
        printf("打印队列元素\n");
        while(!Empty(sqqueue))
            printf("%d\n",DeQueue(sqqueue));
    
    
    }

    败者树:

    #include "stdio.h"
    #define K 8
    #define MINKEY -1//比所有关键字都小的一个值
    #define MAXKEY 1000//比所有关键字都大的一个值
    int b[K];
    void Adjust(int ls[K],int s)//败者树存储在ls[1]~ls[K-1]中,s为记录所在的归并段号
    {
        int t,temp;
        t=(s+K)/2;//t为b[s]的父节点所在败者树中的下标,K是归并段数
        while(t>0)//没有到达树根则继续
        {
            if(b[s]>b[ls[t]]){//与父节点指示的数据进行比较
                temp=s;s=ls[t];//指示胜者,胜者将去参加更上一层比较
                ls[t]=temp;//ls[t]记录败者所在的段号
            }
            t=t/2;//向树根回退一层
        }
        ls[0]=s;//ls[0]记录本趟最小关键字所在的短号
    }
    int Get_next(int i)
    {
    
    
    }
    void K_merger(int ls[K])
    /*ls[0]~ls[K-1]是败者树的内部节点。b[0]~b[K-1]分别存储K个初始归并段的当前记录*/
    /*函数Get_next(i)从第i个归并段读取并返回当前记录,若归并段为空,则返回MAXKEY*/
    {
        int b[K+1],i,q;
        for(i=0;i<K;i++)
            b[i]=Get_next(i);//分别读取K个归并段的第一个关键字
        b[K]=MINKEY;
        for(i=0;i<K;++i)ls[i]=K;//创建败者树,设置ls中败者的初值。
        for(i=K-1;i>=0;--i)//依次从b[K-1],b[K-1]..b[0]出发调整败者树。
            Adjust(ls,i);
        while(b[ls[0]]!=MAXKEY)//ls[0]记录本趟最小关键字所在的段号
        {
            q=ls[0];//q是当前最小关键字的所在的归并段。
            printf("%d",b[q]);
            b[q]=Get_next(q);
            Adjust(ls,q);
        }
    }
  • 相关阅读:
    django页面分类和继承
    django前端从数据库获取请求参数
    pycharm配置django工程
    django 应用各个py文件代码
    CF. 1428G2. Lucky Numbers(背包DP 二进制优化 贪心)
    HDU. 6566. The Hanged Man(树形背包DP DFS序 重链剖分)
    小米邀请赛 决赛. B. Rikka with Maximum Segment Sum(分治 决策单调性)
    区间树 学习笔记
    CF GYM. 102861M. Machine Gun(主席树)
    2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) (B, D, G, H)
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/2834775.html
Copyright © 2011-2022 走看看