【0004】数据结构中的栈、堆的实践

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

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

结构体

void main006()
{
    struct myStruct            // 结构体的意义:将多种类型的数据整合在一起
    {
        int a[10];
        int i;
    };

    struct myStruct mys = { {1,3,5,6},10 };            // 初始化数据

    printf("%d, %d \n", mys.i, mys.a[3]);            // 访问结构体内部成员的三种方式
    printf("%d \n", (&mys)->i);
    printf("%d \n", (*(&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('\n');
    }
    

    while (!isemptyQ(&myq))
    {
        printf("出队的值为:%d\n", getQueue(&myq));
        deQueue(&myq);
        showQueue(&myq);
        putchar('\n');
    }

    system("pause");
}


Queue myq;
void run(void *p)
{
    int *px = p;
    printf("线程编号为:%d \n", *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");
}
队列实现先进先出

 

posted @ 2020-07-25 11:40  ant_colonies  阅读(143)  评论(0编辑  收藏  举报