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

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

 

 

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

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

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

[算法] leetcode栈与队列相关题目详解

第六课 算法效率的度量

数据结构与算法--栈与队列

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