当前位置: 首页 > news >正文

嵌入式学习的第二十二天-数据结构-栈+队列

一、栈

1.定义:栈是限定仅在表尾进行插入和删除操作的线性表先进后出、后进先出

2.栈顶(top):允许操作的一端  栈底(bottom):不允许操作的一端

3.栈的插入操作叫做进栈,也叫压栈、入栈;栈的删除操作叫做出站,也叫弹栈。

:链式结构只支持头删和头插

4.栈的一般操作

(1).创建 CreateSeqStack

LinkStack*CreateLinkStack()
{LinkStack*ls = (LinkStack*)malloc(sizeof(LinkStack));if(NULL == ls){fprintf(stderr,"CreateLinkStack malloc\n");return NULL;}ls->top =NULL;ls->clen = 0;return ls;
}


(2).销毁 DestroySeqStack

int DestoryLinkStack(LinkStack*ls)
{int len = GetSizeLinkStack(ls);int i = 0;for(i = 0;i < len;++i){PopLinkStack(ls);}free(ls);ls->top = NULL;return 0;
}


(3).判断是否为空栈 IsEmptySeqStack

int IsEmptyLinkStack(LinkStack*ls)
{return 0 == ls->clen;
}


(4).获取栈顶元素

DATATYPE*GetTopLinkStack(LinkStack*ls)
{if(IsEmptyLinkStack(ls)){return NULL;}return &ls->top->data;
}


(5).进栈 PushSeqStack

int PushLinkStack(LinkStack*ls,DATATYPE*data)
{LinkStackNode *newnode = malloc(sizeof(LinkStackNode));if(NULL == ls){fprintf(stderr,"PushLinkStack malloc\n");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next =NULL;newnode->next = ls->top;ls->top = newnode;ls->clen++;return 0;
}


(6).出栈 PopSeqStack

int PopLinkStack(LinkStack*ls)
{if(IsEmptyLinkStack(ls)){return 1;}LinkStackNode *tmp = ls->top;ls->top = ls->top->next;free(tmp);ls->clen--;return 0;
}

二、队列

1.定义:队列是只允许在一段进行插入,而在另一端进行删除操作的线性表。

2.允许插入的称谓队尾,允许删除的一端队头。

3.特性:先进先出

4.队列的一般操作

(1)满队和空队的判断

满队:(tail+1)%tlen=head;空对:tail = head;

(2)创建 CreateSeQue

SeqQueue* CreateSeqQue(int len)
{SeqQueue*sq = (SeqQueue*)malloc(sizeof(SeqQueue));if(NULL == sq){fprintf(stderr, "CreateSeQueue malloc\n");return NULL;}sq->array = (malloc(sizeof(DATATYPE)*len));if(NULL == sq->array){fprintf(stderr, "CreateSeQueue malloc\n");return NULL;}sq->head = 0;sq->tail = 0;sq->tlen =len;return sq;}

(3)判空

int IsEmptySeqQue(SeqQueue*sq)
{return sq->head==sq->tail;
}

(4)判满

int IsFullSeqQue(SeqQueue*sq)
{return (sq->tail+1)%sq->tlen == sq->head;
}

(5)进队

int EnterSeqQue(SeqQueue*sq,DATATYPE*data)
{if(IsFullSeqQue(sq)){fprintf(stderr,"EnterSeqQue,SeqQue full\n");return 1;}memcpy(&sq->array[sq->tail], data, sizeof(DATATYPE));sq->tail = (sq->tail+1)%sq->tlen;return 0;;
}

(6)出队

int QuitSeqQue(SeqQueue*sq)
{if(IsEmptySeqQue(sq)){fprintf(stderr,"QuitSeqQue SeqQue empty\n");return 1;}sq->head =(sq->head+1)%sq->tlen;return 0;
}

(7)获得队头元素

DATATYPE* GetHeadSeqQue(SeqQueue*sq)
{if(IsEmptySeqQue(sq)){return NULL;}return &sq->array[sq->head];
}

(9)销毁

int DestroySeqQue(SeqQueue*sq)
{free(sq->array);free(sq);return 0;
}

http://www.xdnf.cn/news/509167.html

相关文章:

  • Eigen与OpenCV矩阵操作全面对比:最大值、最小值、平均值
  • c++总结-03-move
  • 系统架构设计师考前冲刺笔记-第1章-系统工程与信息系统基础
  • DeepSeek系列大语言模型推理优化技术深度解析
  • (10)python开发经验
  • SparkSQL基本操作
  • Git多人协作
  • 10.7 LangChain v0.3架构大升级:模块化设计+多阶段混合检索,开发效率飙升3倍!
  • 【甲方安全建设】拉取镜像执行漏洞扫描教程
  • el-dialog鼠标在遮罩层松开会意外关闭,教程图文并茂
  • 限流算法 + dfa敏感词过滤算法
  • ubuntu的虚拟机上的网络图标没有了
  • 学习!FastAPI
  • Ubuntu---omg又出bug了
  • Spring Boot 与 RabbitMQ 的深度集成实践(二)
  • Web开发-JavaEE应用SpringBoot栈SnakeYaml反序列化链JARWAR构建打包
  • 5.18本日总结
  • LeetCode 35. 搜索插入位置:二分查找的边界条件深度解析
  • nginx概念及使用
  • 分别用 语言模型雏形N-Gram 和 文本表示BoW词袋 来实现文本情绪分类
  • 数据结构 -- 树形查找(三)红黑树
  • Flink 作业提交流程
  • 墨水屏显示模拟器程序解读
  • 《信息论与编码》课程笔记——信源编码(2)
  • vue3_flask实现mysql数据库对比功能
  • FreeSWITCH 简单图形化界面43 - 使用百度的unimrcp搞个智能话务台,用的在线的ASR和TTS
  • NAT(网络地址转换)逻辑图解+实验详解
  • 抖音视频怎么去掉抖音号水印
  • tomcat查看状态页及调优信息
  • 碎片笔记|PromptStealer复现要点(附Docker简单实用教程)