zoukankan      html  css  js  c++  java
  • 【0004】数据结构中的栈、堆的实践

      数据结构中的栈——先进后出,先进先出

      数据结构中的堆——堆的本质是一个二叉树,包括二分法查找,朗格朗日差值查找,堆排序查找极值

    结构体

    void main006()
    {
        struct myStruct            // 结构体的意义:将多种类型的数据整合在一起
        {
            int a[10];
            int i;
        };
    
        struct myStruct mys = { {1,3,5,6},10 };            // 初始化数据
    
        printf("%d, %d 
    ", mys.i, mys.a[3]);            // 访问结构体内部成员的三种方式
        printf("%d 
    ", (&mys)->i);
        printf("%d 
    ", (*(&mys)).i);
    
        for (int j = 0; j < 10; j++)
            printf("%d ", mys.a[j]);
    
        system("pause");
    }
    结构体的概念及引用方法

    栈应用

    头文件

    #include <stdio.h>
    #include <stdlib.h>
    #include <memory.h>
    
    #define N 100
    
    struct stack
    {
        int data[N];
        int top;                // 栈顶
    };
    
    
    typedef struct stack Stack;        // 结构体struct stack的别名
    
    
    void init(Stack *p);            // 初始化(清空栈)
    int isempty(Stack *p);        // 栈是否为空
    int isfull(Stack *p);            // 栈是否溢出
    int getTop(Stack *p);            // 获取栈顶
    void push(Stack *p, int key);    // 压栈(插入数据)
    void pop(Stack *p);            // 出栈
    void show(Stack *p);            // 显示栈信息
    stack.h

    栈实体函数

    #include "stack.h"
    
    void init(Stack *p)            // 初始化(清空栈)
    {
        p->top = -1;            // 代表为空
        memset(p->data, 0, sizeof(int)*N);        // 数据清零
    }
    
    int isempty(Stack *p)            // 栈是否为空
    {
        if (p->top == -1)
            return 1;
        else
            return 0;
    }
    
    int isfull(Stack *p)            // 栈是否溢出
    {
        if (p->top >= N)
            return 1;
        else
            return 0;
    }
    
    int getTop(Stack *p)            // 获取栈顶
    {
        return p->data[p->top];
    }
    
    void push(Stack *p, int key)    // 压栈(插入数据)
    {
        if (isfull(p))
            return;
        else
        {
            p->top += 1;
            p->data[p->top] = key;
        }
    }
    
    void pop(Stack *p)                // 出栈
    {
        if (isempty(p))
            return;
        else
            p->top -= 1;
    }
    
    void show(Stack *p)
    {
        if (isempty(p))
            return;
        else
            for (int i = 0; i <= p->top; i++)
                printf("%4d", p->data[i]);
    }
    stack.c
    void main007()
    {
        int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
    
        Stack mystack;
        init(&mystack);
    
        // 数据结构:先进后出(函数参数)
        for (int i = 0; i < 10; i++)
        {
            push(&mystack, a[i]);                // 先压栈
        }
    
        while (!isempty(&mystack))
        {
            printf("%d ", getTop(&mystack));        // 后出栈
            pop(&mystack);
        }
            
        
        system("pause");
    }
    栈实现先进后出
    void main007()
    {
        int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
    
        Stack mystack;
        init(&mystack);
        
        // 数据结构:先进先出(排队买票)
        for (int i = 0; i < 10; i++)
        {
            push(&mystack, a[i]);                // 压栈
            printf("%d ", getTop(&mystack));        // 打印   
                    pop(&mystack);                    // 出栈
        }
    
        system("pause");
    }    
    栈实现先进先出

    递归方式实现十进制转化为二进制

    void from10to2(int num)
    {
        if (num == 0)
            return;
        else
        {
            from10to2(num / 2);
            printf("%d", num % 2);
        }
    }
    
    void main008()
    {
        int num;
        scanf("%d", &num);
    
        from10to2(num);
    
        system("pause");
    }
    递归法十进制转换为二进制

    栈的“先进后出”方式的实现十进制转化为二进制

    #define _CRT_SECURE_NO_WARNINGS
    #include "stack.h"
    
    
    void main009()
    {
        Stack mystack;
        init(&mystack);
    
        int num;
        scanf("%d", &num);
    
        // 先进后出
        /*while (num)
        {
            push(&mystack, num % 2);            
            num /= 2;
        }
    
        while (!isempty(&mystack))
        {
            printf("%d", getTop(&mystack));
            pop(&mystack);
        }*/
    
        // 先进先出
        while (num)
        {
            push(&mystack, num % 2);            
            printf("%d", getTop(&mystack));        
            pop(&mystack);
            num /= 2;
        }
    
        system("pause");
    }
    栈实现十进制转换为二进制

    队列应用

    头文件

    #include <process.h>
    #include <Windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <memory.h>
    
    #define N 100                                        // 队列的长度
    struct queue
    {
        int data[N];
        int head;
        int tail;
    };
    
    typedef struct queue Queue;
    
    void initQ(Queue *p);                    // 初始化队列
    int isemptyQ(Queue *p);
    int isfullQ(Queue *p);
    
    void enQueue(Queue *p, int key);        // 入队
    int getQueue(Queue *p);                // 出队值
    void deQueue(Queue *p);                // 出队
    void showQueue(Queue *p);
    
                                    
    queue.h

    队列实体函数

    #include "queue.h"
    
    
    void initQ(Queue *p)
    {
        p->head = p->tail = 0;
        memset(p->data, 0, sizeof(int)*N);
    }
    
    int isemptyQ(Queue *p)
    {
        if (p->head == p->tail)
            return 1;
        else
            return 0;
    }
    
    int isfullQ(Queue *p)
    {
        if (p->tail >= N - 1)
            return 1;
        else
            return 0;
    }
    
    void enQueue(Queue *p, int key)
    {
        if (isfullQ(p))
        {
            return;
        }
        else
        {
            if (isemptyQ(p))
            {
                p->data[0] = key;
                p->tail++;
            }
            else
            {
                for (int i = p->tail; i >= 0; i--)    // 数据后移一位
                {
                    p->data[i] = p->data[i - 1];
                }
    
                p->data[0] = key;
                p->tail++;
            }
        }
    }
    
    int getQueue(Queue *p)
    {
        return p->data[p->tail - 1];
    }
    
    void deQueue(Queue *p)
    {
        if (isemptyQ(p))
            return;
        else
            p->tail--;
    }
    
    void showQueue(Queue *p)
    {
        for (int i = 0; i < p->tail; i++)
            printf("%4d", p->data[i]);
    }
    queue.c

     多线程与队列的实践

    #include "queue.h"
    
    void main016()
    {
        Queue myq;
        initQ(&myq);
    
        for (int i = 98; i < 109; i++)
        {
            enQueue(&myq, i);
            showQueue(&myq);
            putchar('
    ');
        }
        
    
        while (!isemptyQ(&myq))
        {
            printf("出队的值为:%d
    ", getQueue(&myq));
            deQueue(&myq);
            showQueue(&myq);
            putchar('
    ');
        }
    
        system("pause");
    }
    
    
    Queue myq;
    void run(void *p)
    {
        int *px = p;
        printf("线程编号为:%d 
    ", *px);
        enQueue(&myq, *px);
    }
    
    void main017()
    {
        initQ(&myq);
    
        int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
        for (int i = 0; i < 10; i++)
        {
            HANDLE hd = _beginthread(run, 0, &a[i]);    // 多核运行多线程,打印是无序的
            //WaitForSingleObject(hd,INFINITE);        // 等待一个线程结束之后,再允许下一个线程执行(有序打印)
        }
    
    
        system("pause");
        showQueue(&myq);
        system("pause");
    }
    队列实现先进先出
  • 相关阅读:
    第三章 Selenide测试框架
    第二章 自动化测试的本质理解
    第一章 软件自动化测试的基础知识
    【算法学习】03---算法分析学习
    【算法学习】03---算法分析
    【算法学习】02---二分算法总结
    【算法学习】01---java基础以及算法基础常用类库
    前端自动化测试一些学习记录
    Ubuntu下安装Sublime3的Markdown插件
    octopress搭建记录
  • 原文地址:https://www.cnblogs.com/ant-colonies/p/13376098.html
Copyright © 2011-2022 走看看