数据结构——栈和队列

embedded/2025/1/16 11:12:26/

目录

栈和队列

1.栈FILO

  顺序栈:(空增栈)  

 链式栈

2.队列

栈和队列

栈和队列是特殊的表状结构
表可以在任意位置插入和删除
栈和队列只允许在固定位置插入和删除

1.栈FILO

先进后出,后进先出

 栈顶:允许入栈出栈的一端称为栈顶
 栈底:不允许入栈和出栈的一端称为栈底
 入栈(压栈):将数据元素放入栈顶
 出栈(弹栈):将数据元素从栈顶位置取出

  顺序栈:(空增栈)  

     结构体定义:

//存放数据的类型
typedef int DataType;//标签类型
typedef struct stack 
{DataType *pData;int Top;int tLen;
}SeqStack
SeqStack *CreateSeqStack(int MaxLen)
{SeqStack *pTmpStack = NULL;//1.申请标签空间pTmpStack = malloc(sizeof(SeqStack));if (NULL == pTmpStack){return NULL;}//2.对每个成员赋初值pTmpStack->tLen = MaxLen;pTmpStack->Top = 0;pTmpStack->pData = malloc(MaxLen * sizeof(DataType));if (NULL == pTmpStack->pData){return NULL;}//3.申请存放数据的空间//4.返回标签地址 return pTmpStack;
}int IsFullSeqStack(SeqStack *pTmpStack)
{return pTmpStack->tLen == pTmpStack->Top ? 1 : 0;
}int IsEmptySeqStack(SeqStack *pTmpStack)
{return 0 == pTmpStack->Top ? 1 : 0;
}int PushSeqStack(SeqStack *pTmpStack, DataType TmpData)
{if (IsFullSeqStack(pTmpStack)){return -1;}pTmpStack->pData[pTmpStack->Top] = TmpData;pTmpStack->Top++;return 0;
}DataType PopSeqStack(SeqStack *pTmpStack)
{if (IsEmptySeqStack(pTmpStack)){return -1;}pTmpStack->Top--;return pTmpStack->pData[pTmpStack->Top];
}int DestroySeqStack(SeqStack **ppTmpStack)
{free((*ppTmpStack)->pData);free(*ppTmpStack);*ppTmpStack = NULL;return 0;
}

 链式栈

可以使用内核链表实现

步骤1.使用头插法,插入到链表中(入栈)

           2.每次删除,始终删头结点指向的下一个节点next;(出栈)

#include "list.h"
#include <stdio.h>typedef struct data 
{struct list_head node;int data;
}data_t;int main(void)
{struct list_head *ptmpnode = NULL;data_t d[5] = {{{NULL, NULL}, 1},{{NULL, NULL}, 2},{{NULL, NULL}, 3},{{NULL, NULL}, 4},{{NULL, NULL}, 5},};int i = 0;//定义链表空节点,并初始化struct list_head head;INIT_LIST_HEAD(&head);//将5个数据头插法插入链表中for (i = 0; i < 5; i++){list_add(&d[i].node, &head);}//只要链表不为空将第一个节点出栈while (!list_empty(&head)){   ptmpnode = head.next;printf("%d ", list_entry(ptmpnode, data_t, node)->data);list_del(head.next);}printf("\n");return 0;
}
2.队列

先进先出,后进后出(排队)

也可以使用内核链表实现

步骤:1.使用尾插法,插入到链表中(入队)

           2.每次删除,始终删头结点指向的下一个节点next;(出队)


http://www.ppmy.cn/embedded/102906.html

相关文章

一款支持固定区域,固定尺寸大小重复截图的软件

WinSnap是一款功能强大的屏幕截图软件&#xff0c;可以实现对固定区域&#xff0c;固定尺寸大小区域重复截图&#xff0c;适用于日常截图需求和专业用户进行屏幕截图和图像编辑。通过设置快捷键&#xff0c;方便快速重复截图固定区域固定大小。它支持捕捉整个屏幕、活动窗口、选…

Redis 实现哨兵模式

目录 1 哨兵模式介绍 1.1 什么是哨兵模式 1.2 sentinel中的三个定时任务 2 配置哨兵 2.1 实验环境 2.2 实现哨兵的三条参数&#xff1a; 2.3 修改配置文件 2.3.1 MASTER 2.3.2 SLAVE 2.4 将 sentinel 进行备份 2.5 开启哨兵模式 2.6 故障模拟 3 在整个架构中可能会出现的问题 …

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

智能听诊器:开启宠物健康管理新维度

在宠物医疗保健的快速演进中&#xff0c;智能听诊器作为一项创新技术&#xff0c;正不断拓展其应用边界&#xff0c;为宠物健康管理带来全方位的革新。这些延伸将如何塑造宠物健康的未来呢&#xff01; 智能数据分析与机器学习 智能听诊器的未来将更加依赖于先进的数据分析和…

深入解析财务报表:掌握重要财务指标的技巧

一、概述 财务报表中有大量信息&#xff0c;如果我们在分析时缺乏明确的方向或忽视了重点&#xff0c;就很容易在繁杂的数据中迷失方向。本文将深入探讨财务报表中的几个重要指标&#xff0c;帮助大家更有针对性地理解这些内容&#xff0c;包括如何分析资产负债率、解读净资产…

keil编译输出的信息program size含义,以及个人使用中的编译内存溢出问题

keil编译后输出的信息含义 data对应的是片内的RAM&#xff0c;xdata对应的是程序中片外扩展的存储器上需要占用的容量&#xff0c;code是编写的程序占用单片机片内的存储程序ROM上的容量。 编译中发现错误 上图中的data值占用了147字节&#xff0c;超过了128字节。 一般解决…

微服务中间件之Nacos-安装篇

Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是由阿里巴巴开发的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。以下是Nacos的安装说明&#xff0c;主要适用于Linux/macOS系统以及Windows系统&#xff08;以最新版本的Nacos为例…

MySQL集群

一、Mysql 在服务器中的部署方法 1.1源码安装 下载依赖性 dnf install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 解压压缩包并安装 tar zxf mysql-boost-5.7.44.tar.gz cd /root/mysql-5.7.44 cmake \ -DCM…