当前位置: 首页 > 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;
}

相关文章:

  • NC016NC017美光固态芯片NC101NC102
  • LLMs:《POE报告:2025年春季人工智能模型使用趋势》解读
  • 服务器防文件上传手写waf
  • 【每日一题丨2025年5.12~5.18】排序相关题
  • LeeCode 101.对称二叉树
  • 互联网大厂Java面试场景:从缓存到容器化的技术问答
  • H2数据库源码学习+debug, 数据库 sql、数据库引擎、数据库存储从此不再神秘
  • 代码随想录算法训练营第六十六天| 图论11—卡码网97. 小明逛公园,127. 骑士的攻击
  • OpenAI推出Codex — ChatGPT内置的软件工程Agents
  • (三)MMA(KeyCloak身份服务器/OutBox Pattern)
  • Git基础原理和使用
  • 一个stm32工程从底层上都需要由哪些文件构成
  • 鸿蒙AI开发:10-多模态大模型与原子化服务的集成
  • C++23:修正常量迭代器、哨兵和范围
  • 【NLP 75、如何通过API调用智谱大模型】
  • Spark,连接MySQL数据库,添加数据,读取数据
  • 【自然语言处理与大模型】向量数据库技术
  • 通俗解释Transformer在处理序列问题高效的原因(个人理解)
  • 掌握LINQ:查询语法与方法语法全解析
  • CodeBuddy初探
  • 达恩当选罗马尼亚总统
  • 中国戏剧梅花奖终评结果公示,蓝天和朱洁静等15名演员入选
  • 海南保亭警方通报“两飞车党紧追女童”:两名初中生认错道歉
  • 取得金奖西瓜品种独家使用权的上海金山,为何要到异地“试种”?
  • 广东高州发生山体滑坡,造成2人遇难4人送医救治1人失联
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查