嵌入式第六课-数据结构和算法—栈与循环队列

Posted Soaring2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式第六课-数据结构和算法—栈与循环队列相关的知识,希望对你有一定的参考价值。

1. 数据结构:栈、队列、链表、二叉树。

1.1 数据结构:描述计算机中数据之间的关系和存储方式。

1.2 数据结构分类(有逻辑结构、物理结构、运算结构)

   1.2.1 逻辑结构:数据之间的关系

         1)集合结构:强调总体,不强调数据之间关系。

         2)线性结构:描述数据之间一对一的前后关系。

         3)树形结构:描述数据一对多的关系。

         4)网状结构:数据多对多的关系。

  1.2.2物理结构:数据存放方式

          1)顺序存储结构:数组存储数据。

          2)链式存储结构:链表

  1.2.3运算结构:数据的运算过程

 1.3 栈:基本特性:后进先出(LIFO) 最后放进去的 最先取出 只能操作栈顶。

     1.3.1栈的操作基本原理

            子弹夹上弹退弹。

             栈地址,栈容量,入栈,出栈,栈顶。

示例:

#include <stdio.h>
#include <stdlib.h>

typedef struct stack{
        int *arr;
        int cap;
        int top;
}stack_t;

void init_stack(stack_t *stack,int cap)
{
        stack -> arr = (int*)malloc(cap * sizeof(int));
        stack -> cap = cap;
        stack -> top = 0;
}
void delete_stack(stack_t *stack)
{
        free(stack -> arr);
        stack -> cap = 0;
        stack -> top = 0;
}
int stack_is_full(stack_t *stack)
{
        return ((stack -> top) >= (stack -> cap));
}
int stack_is_empty(stack_t *stack)
{
 return    (!( stack -> top));
}
void stack_push(stack_t *stack,int data)
{
        if(stack -> cap > stack -> top )
        stack -> arr[stack -> top ++] = data;
}
int stack_pop(stack_t *stack)
{
        if(stack -> top > 0 )
        {
                return (stack -> arr[--stack -> top] );
        }
        else
        {
                return 0xffffffff;
        }
}
int get_stack_top(stack_t *stack)
{
        return (stack -> arr[(stack -> top)-1]);
}

int get_stack_size(stack_t *stack)
{
        return (stack -> top);
}
int main(void)
{
        stack_t stack;
        init_stack(&stack,10);
        if(stack_is_empty(&stack))
        {
                printf("the stack is empty\\r\\n");
        }
        int i=0;
        while(1)
        {

                if(stack_is_full(&stack))
                {
                   printf("\\r\\nthe stack is full! \\r\\n");
                    break;
                }
                else
                {
                   printf("push: %d ",i);
                   stack_push(&stack,i);
                   i++;
                }


        }
        while(1)
        {
                if(stack_is_empty(&stack))
                {
                        printf("\\r\\nthe stack is empty!\\r\\n");
                        break;
                }
                else
                {
                        printf("pop: %d ",stack_pop(&stack));
                }
        }

        delete_stack(&stack);
   return 0;
}
执行结果:

1.4 队列 :先进先出 (FIFO)

第一个元素称首元素,最后一个元素称尾元素,数据取头加尾

  Linux 系统三大队列:

  消息队列:进程间通信

  工作队列:延后执行

  等待队列:等待被唤醒

循环对列示例:

#include <stdio.h>
#include <stdlib.h>

typedef struct queue{
        int *arr;
        int cap;
        int size;
        int front;
        int rear;
}queue_t;

void queue_init(queue_t *queue , int cap)
{
        queue -> arr   = (int*)malloc(cap*sizeof(queue->arr[0]));
        queue -> cap   = cap;
        queue -> size  = 0;
        queue -> front = 0;
        queue -> rear  = 0;
}

void delete_queue(queue_t *queue)
{
        free(queue -> arr);
        queue -> cap   = 0;
        queue -> size  = 0;
        queue -> front = 0;
        queue -> rear  = 0;
}

int queue_full(queue_t *queue)
{
        return queue -> size >= queue -> cap;
}
int queue_empty(queue_t *queue)
{
        return  !queue -> size;
}
void queue_push(queue_t *queue,int data)
{
        if(queue -> size < queue -> cap)
        {
                if(queue -> rear >= queue -> cap)
                        queue -> rear =0;
                queue -> arr[queue -> rear++] = data;
                queue -> size ++;
        }
}

int queue_pop(queue_t *queue)
{
        if(queue -> front >= queue -> cap)
        {
                queue -> front =0;
        }
        queue -> size --;
        return queue -> arr[queue -> front++];
}

int main(void)
{
        int i=0;
        queue_t queue;
        queue_init(&queue,10);
        while(1)
        {
                if(queue_full(&queue))
                {
                        printf("\\r\\nthe queue is full \\r\\n");
                        break;
                }
                else
                {
                        printf("push: %d ",i);
                        queue_push(&queue,i);
                        i++;
                }
        }
        while(1)
        {
                if(queue_empty(&queue))
                {
                        printf("\\r\\nthe queue is empty\\r\\n");
                        break;
                }
                else
                {
                        printf("pop: %d ",queue_pop(&queue));
                }
        }

        delete_queue(&queue);

        return 0;
}
执行结果:

嵌入式第五课-C语言结构体  https://blog.csdn.net/qq_21919455/article/details/117262588

 

 

以上是关于嵌入式第六课-数据结构和算法—栈与循环队列的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式第六课-数据结构和算法—栈与循环队列

栈与队列:循环队列算法+可执行代码

第六课 算法效率的度量

数据结构与算法知识点总结队列栈与散列表

数据结构第六课------------狄泰软件学院

第六课算法效率的度量