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

一、栈

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;
}
相关推荐
雍凉明月夜15 分钟前
c++ 精学笔记记录Ⅲ
c++·笔记·学习
LYFlied20 分钟前
【每日算法】LeetCode 78. 子集
数据结构·算法·leetcode·面试·职场和发展
月明长歌25 分钟前
【码道初阶】【Leetcode606】二叉树转字符串:前序遍历 + 括号精简规则,一次递归搞定
java·数据结构·算法·leetcode·二叉树
子枫秋月25 分钟前
C++字符串操作与迭代器解析
数据结构·算法
(●—●)橘子……27 分钟前
记力扣1471.数组中的k个最强值 练习理解
数据结构·python·学习·算法·leetcode
阿蒙Amon30 分钟前
JavaScript学习笔记:17.闭包
javascript·笔记·学习
想不出名字ಥ_ಥ36 分钟前
STM32学习笔记--01学会如何点亮一颗LED灯
笔记·stm32·学习
LYFlied43 分钟前
【算法解题模板】-【回溯】----“试错式”问题解决利器
前端·数据结构·算法·leetcode·面试·职场和发展
lxh01131 小时前
最长有效括号
数据结构·算法
fei_sun1 小时前
【总结】【数据结构】【OS】【计组】【计网】
数据结构