系统栈、数据结构栈、栈的基本操作、队列、队列的基本操作

我要成为嵌入式高手之3月21日数据结构第四天!!
———————————————————————————— 

先进后出、后进先出

一、系统栈

大小:8MB

1、局部变量

2、未经初始化为随机值

3、代码执行到变量定义时为变量开辟空间

4、当变量的作用域结束时回收空间

5、函数的形参和返回值

6、函数的调用关系、保护现场和恢复现场

7、栈的增长方向,自高向低增长

二、栈:FILO

怎样具备先进后出、后进先出?

类似羽毛球桶

FILO(栈)

只允许从一端进行数据的插入和删除的线性存储结构(线性表)(一对一的线性存储结构,与顺序表、链式表类似)

插入:入栈、压栈 — 栈顶(允许操作)

删除:出栈、弹栈 — 栈底(不允许操作)

顺序表——顺序栈

满增栈        满减栈        空增栈        空减栈

入栈时操作方法不同

满、空栈

栈顶所在位置是否存有元素

增、减栈

取决于栈增长的方向

增:栈顶由低地址向高地址

减:栈顶由高地址向低地址

链式表——链式栈

栈顶、栈底

栈的基本操作:

注:只针对于链式栈

1、创建栈

/* 创建栈 */
STACK_LIST *CreateStackList()
{
    STACK_LIST *plist = malloc(sizeof(STACK_LIST));
    if (NULL == plist)
    {
        perror("fail to malloc list");
        return NULL;
    }

    plist->ptop = NULL;
    plist->clen = 0;

    return plist;
}

2、入栈

/* 入栈 */
int JoinStrackNode(STACK_LIST *plist, DATA_TYPE data)
{
    STACK_NODE *pnode = malloc(sizeof(STACK_NODE));
    if (NULL == pnode)
    {
        perror("fail to malloc pnode");
        return -1;
    }
    pnode->data = data;
    pnode->pnext = NULL;

    pnode->pnext = plist->ptop;
    plist->ptop = pnode;
    plist->clen++;
    
    return 0;
}

3、出栈

/* 出栈 */
int LeaveStackNode(STACK_LIST *plist_in, STACK_LIST *plist_out)
{
    STACK_NODE *pfree = NULL;

    if (NULL == plist_in->ptop)
    {
        return -1;
    }
    else
    {
        pfree = plist_in->ptop;
        plist_in->ptop = plist_in->ptop->pnext;
        pfree->pnext = NULL;
        plist_in->clen--;
    }
    f (NULL == plist_out->ptop)
    {
        plist_out->ptop = pfree;
    }
    else
    {
        pfree->pnext = plist_out->ptop;
        plist_out->ptop = pfree;
        plist_out->clen++;
    }

    return 0;
}

4、获取栈顶元素

/* 获取栈顶元素 */
STACK_NODE *GetStackTop(STACK_LIST *plist)
{
    if (NULL == plist->ptop)
    {
        return NULL;
    }
    else
    {
        return plist->ptop;
    }
}

5、清空栈

/* 清空栈 */
int DeleteStackAll(STACK_LIST *plist)
{
    STACK_NODE *ptmp = plist->ptop;
    STACK_NODE *pfree = NULL;

    if (NULL == plist->ptop)
    {
        return -1;
    }
    while (ptmp != NULL)
    {
        pfree = ptmp;
        ptmp = ptmp->pnext;
        plist->ptop = ptmp;
        free(pfree);
    }

    return 1;
}

6、销毁栈

/* 销毁栈 */
int DestroyStack(STACK_LIST *plist)
{
    int ret = 0;

    if (NULL == plist->ptop)
    {
        free(plist);
    }
    else
    {
        ret = DeleteStackAll(plist);
        if (1 == ret)
        {
            free(plist);
        }
    }

    return 0;
}

7、测试:遍历

/* 测试:遍历 */
int SearchAllStack(STACK_LIST *plist)
{
    STACK_NODE *ptmp = plist->ptop;

    if (NULL == plist->ptop)
    {
        printf("NO DATA!\n");
        return -1;
    }
    else
    {
        while (ptmp != NULL)
        {
            printf("%d\n", ptmp->data);
            ptmp = ptmp->pnext;
        }
    }

    return 0;
}

总程序:

头文件

#ifndef _HEAD_H
#define _HEAD_H

#include <stdio.h>
#include <stdlib.h>

typedef int DATA_TYPE;

typedef struct node
{
    DATA_TYPE data;
    struct node *pnext;
}STACK_NODE;

typedef struct list
{
    STACK_NODE *ptop;
    int clen;
}STACK_LIST;


extern STACK_LIST *CreateStackList();
extern int JoinStrackNode(STACK_LIST *plist, DATA_TYPE data);
extern int LeaveStackNode(STACK_LIST *plist_in, STACK_LIST *plist_out);
extern int SearchAllStack(STACK_LIST *plist);
extern STACK_NODE *GetStackTop(STACK_LIST *plist);
extern int DeleteStackAll(STACK_LIST *plist);
extern int DestroyStack(STACK_LIST *plist);

#endif

 main.c

#include "head.h"

int main(void)
{
    int ret = 0;

    /* 创建入栈列表 */
    STACK_LIST *plist_in = CreateStackList();
    if (NULL == plist_in)
    {
        perror("fail to create plist_in");
        return -1;
    }
    
    /* 创建出栈列表 */
    STACK_LIST *plist_out = CreateStackList();
    if (NULL == plist_out)
    {
        perror("fail to create plist_out");
        return -1;
    }

    /* 入栈 */
    JoinStrackNode(plist_in, 1);
    JoinStrackNode(plist_in, 2);
    JoinStrackNode(plist_in, 3);
    JoinStrackNode(plist_in, 4);
    JoinStrackNode(plist_in, 5);
    SearchAllStack(plist_in);
    printf("========================\n");

    /* 出栈 */
    LeaveStackNode(plist_in, plist_out);
    LeaveStackNode(plist_in, plist_out);
    LeaveStackNode(plist_in, plist_out);
    printf("plist_in:\n");
    SearchAllStack(plist_in);
    printf("========================\n");
    printf("plist_out:\n");
    SearchAllStack(plist_out);

    /* 获取栈顶元素 */
    STACK_NODE *top = GetStackTop(plist_in);
    if (NULL == top)
    {
        perror("fail to GetStackTop");
    }
    printf("top data:%d\naddr:%p\n", top->data, top);
    printf("========================\n");

    /* 清空栈 */
    DeleteStackAll(plist_in);
    SearchAllStack(plist_in);

    /* 销毁栈 */
    DestroyStack(plist_in);
    DestroyStack(plist_out);


    return 0;
}

功能函数

#include "head.h"

/* 创建栈 */
STACK_LIST *CreateStackList()
{
    STACK_LIST *plist = malloc(sizeof(STACK_LIST));
    if (NULL == plist)
    {
        perror("fail to malloc list");
        return NULL;
    }

    plist->ptop = NULL;
    plist->clen = 0;

    return plist;
}

/* 入栈 */
int JoinStrackNode(STACK_LIST *plist, DATA_TYPE data)
{
    STACK_NODE *pnode = malloc(sizeof(STACK_NODE));
    if (NULL == pnode)
    {
        perror("fail to malloc pnode");
        return -1;
    }
    pnode->data = data;
    pnode->pnext = NULL;

    pnode->pnext = plist->ptop;
    plist->ptop = pnode;
    plist->clen++;
    
    return 0;
}

/* 出栈 */
int LeaveStackNode(STACK_LIST *plist_in, STACK_LIST *plist_out)
{
    STACK_NODE *pfree = NULL;

    if (NULL == plist_in->ptop)
    {
        return -1;
    }
    else
    {
        pfree = plist_in->ptop;
        plist_in->ptop = plist_in->ptop->pnext;
        pfree->pnext = NULL;
        plist_in->clen--;
    }
    f (NULL == plist_out->ptop)
    {
        plist_out->ptop = pfree;
    }
    else
    {
        pfree->pnext = plist_out->ptop;
        plist_out->ptop = pfree;
        plist_out->clen++;
    }

    return 0;
}

/* 获取栈顶元素 */
STACK_NODE *GetStackTop(STACK_LIST *plist)
{
    if (NULL == plist->ptop)
    {
        return NULL;
    }
    else
    {
        return plist->ptop;
    }
}

/* 清空栈 */
int DeleteStackAll(STACK_LIST *plist)
{
    STACK_NODE *ptmp = plist->ptop;
    STACK_NODE *pfree = NULL;

    if (NULL == plist->ptop)
    {
        return -1;
    }
    while (ptmp != NULL)
    {
        pfree = ptmp;
        ptmp = ptmp->pnext;
        plist->ptop = ptmp;
        free(pfree);
    }

    return 1;
}

/* 销毁栈 */
int DestroyStack(STACK_LIST *plist)
{
    int ret = 0;

    if (NULL == plist->ptop)
    {
        free(plist);
    }
    else
    {
        ret = DeleteStackAll(plist);
        if (1 == ret)
        {
            free(plist);
        }
    }

    return 0;
}


/* 测试:遍历 */
int SearchAllStack(STACK_LIST *plist)
{
    STACK_NODE *ptmp = plist->ptop;

    if (NULL == plist->ptop)
    {
        printf("NO DATA!\n");
        return -1;
    }
    else
    {
        while (ptmp != NULL)
        {
            printf("%d\n", ptmp->data);
            ptmp = ptmp->pnext;
        }
    }

    return 0;
}

三、队列:FIFO

概念

允许从一端进行数据插入,而另一端进行数据删除的线性表

特性

先进先出、后进后出

应用场景:缓冲区(数据缓存)

为了解决高速设备和低速设备交互时速度不匹配问题,进行缓存(缓冲)

队列的基本操作:

1、创建队列

/* 创建队列 */
QUEUE_LIST *CreateQueueList()
{
    QUEUE_LIST *plist = malloc(sizeof(QUEUE_LIST));
    if (NULL == plist)
    {
        perror("fail to malloc list");
        return NULL;
    }

    plist->pbegin = NULL;
    plist->pend = NULL;
    plist->clen = 0;

    return plist;
}

2、创建队列元素 

QUEUE_NODE *CreateQueueNode(DATA_TYPE data)
{
    QUEUE_NODE *pnode = malloc(sizeof(QUEUE_NODE));
    if (NULL == pnode)
    {
        perror("fail to malloc node");
        return NULL;
    }
    pnode->data = data;
    pnode->pnext = NULL;

    return pnode;
}

3、入队操作

/* 入队 */
int JoinQueueNode(QUEUE_LIST *plist, QUEUE_NODE *pnode)
{
    QUEUE_NODE *ptmp = NULL;
    
    if (NULL == plist->pbegin)
    {
        plist->pbegin = pnode;
        plist->pend = pnode;
        plist->clen++;
    }
    else
    {
        ptmp = plist->pend;
        ptmp->pnext = pnode;
        plist->pend = pnode;
        plist->clen++;
    }

    return 0;
}

4、出队操作

/* 出队 */
int LeaveQueueNode(QUEUE_LIST *plist)
{
    QUEUE_NODE *ptmp = NULL;
    if (plist->pbegin == NULL)
    {
        printf("NO NODE TO LEAVE\n");
        return -1;
    }
    else if (plist->pbegin == plist->pend && plist->pbegin != NULL)
    {
        free(plist->pbegin);
        plist->clen--;
        plist->pbegin = NULL;
        plist->pend = NULL;
    }
    else
    {
        ptmp = plist->pbegin;
        while (ptmp->pnext->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }
        free(ptmp->pnext);
        ptmp->pnext = NULL;
        plist->pend = ptmp;
        plist->clen--;
    }
    return 0;
}

5、清空队列

/* 清空队列 */
int DeleteQueueAll(QUEUE_LIST *plist)
{
    QUEUE_NODE *ptmp = plist->pbegin;
    QUEUE_NODE *pfree = NULL;
    
    if (NULL == plist->pbegin && plist->pend == NULL)
    {
        return -1;
    }
    while (ptmp != NULL)
    {
        pfree = ptmp;
        ptmp = ptmp->pnext;
        plist->pbegin = ptmp;
        free(pfree);
        plist->clen--;
    }
    plist->pend = NULL;

    return 0;
}

6、获取队列队头的数据

/* 获取队头数据 */
QUEUE_NODE *GetQueueBegin(QUEUE_LIST *plist)
{
    if (NULL == plist->pbegin && NULL == plist->pend)
    {
        return NULL;
    }
    else
    {
        return plist->pbegin;
    }
}

7、销毁队列

/* 销毁队列 */
int DestroyQueue(QUEUE_LIST *plist)
{
    int ret = 0;

    if (NULL == plist->pbegin && plist->pend == NULL)
    {
        free(plist);
    }
    else
    {
        ret = DeleteQueueAll(plist);
        if (0 == ret)
        {
            free(plist);
        }
    }

    return 0;
}

8、测试:遍历

/* 测试:遍历 */
int SearchAllQueue(QUEUE_LIST *plist)
{
    QUEUE_NODE *ptmp = plist->pbegin;

    if (NULL == plist->pbegin && NULL == plist->pend)
    {
        printf("NO DATA!\n");
        return -1;
    }
    else
    {
        while (ptmp != NULL)
        {
            printf("%d\n", ptmp->data);
            ptmp = ptmp->pnext;
        }
    }
    printf("len = %d\n", plist->clen);

    return 0;
}

总程序

头文件:

#ifndef _HEAD_H
#define _HEAD_H

#include <stdio.h>
#include <stdlib.h>

typedef int DATA_TYPE;

typedef struct node
{
    DATA_TYPE data;
    struct node *pnext;
}QUEUE_NODE;

typedef struct list
{
    QUEUE_NODE *pbegin;
    QUEUE_NODE *pend;
    int clen;
}QUEUE_LIST;


extern QUEUE_LIST *CreateQueueList();
extern QUEUE_NODE *CreateQueueNode(DATA_TYPE data);
extern QUEUE_NODE *GetQueueBegin(QUEUE_LIST *plist);
extern int JoinQueueNode(QUEUE_LIST *plist, QUEUE_NODE *pnode);
extern int LeaveQueueNode(QUEUE_LIST *plist);
extern int SearchAllQueue(QUEUE_LIST *plist);
extern int DeleteQueueAll(QUEUE_LIST *plist);
extern int DestroyQueue(QUEUE_LIST *plist);

#endif

功能函数:

#include "head.h"

/* 创建队列 */
QUEUE_LIST *CreateQueueList()
{
    QUEUE_LIST *plist = malloc(sizeof(QUEUE_LIST));
    if (NULL == plist)
    {
        perror("fail to malloc list");
        return NULL;
    }

    plist->pbegin = NULL;
    plist->pend = NULL;
    plist->clen = 0;

    return plist;
}

QUEUE_NODE *CreateQueueNode(DATA_TYPE data)
{
    QUEUE_NODE *pnode = malloc(sizeof(QUEUE_NODE));
    if (NULL == pnode)
    {
        perror("fail to malloc node");
        return NULL;
    }
    pnode->data = data;
    pnode->pnext = NULL;

    return pnode;
}

/* 入队 */
int JoinQueueNode(QUEUE_LIST *plist, QUEUE_NODE *pnode)
{
    QUEUE_NODE *ptmp = NULL;
    
    if (NULL == plist->pbegin)
    {
        plist->pbegin = pnode;
        plist->pend = pnode;
        plist->clen++;
    }
    else
    {
        ptmp = plist->pend;
        ptmp->pnext = pnode;
        plist->pend = pnode;
        plist->clen++;
    }

    return 0;
}

/* 出队 */
int LeaveQueueNode(QUEUE_LIST *plist)
{
    QUEUE_NODE *ptmp = NULL;
    if (plist->pbegin == NULL)
    {
        printf("NO NODE TO LEAVE\n");
        return -1;
    }
    else if (plist->pbegin == plist->pend && plist->pbegin != NULL)
    {
        free(plist->pbegin);
        plist->clen--;
        plist->pbegin = NULL;
        plist->pend = NULL;
    }
    else
    {
        ptmp = plist->pbegin;
        while (ptmp->pnext->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }
        free(ptmp->pnext);
        ptmp->pnext = NULL;
        plist->pend = ptmp;
        plist->clen--;
    }
    return 0;
}

/* 清空队列 */
int DeleteQueueAll(QUEUE_LIST *plist)
{
    QUEUE_NODE *ptmp = plist->pbegin;
    QUEUE_NODE *pfree = NULL;
    
    if (NULL == plist->pbegin && plist->pend == NULL)
    {
        return -1;
    }
    while (ptmp != NULL)
    {
        pfree = ptmp;
        ptmp = ptmp->pnext;
        plist->pbegin = ptmp;
        free(pfree);
        plist->clen--;
    }
    plist->pend = NULL;

    return 0;
}

/* 获取队头数据 */
QUEUE_NODE *GetQueueBegin(QUEUE_LIST *plist)
{
    if (NULL == plist->pbegin && NULL == plist->pend)
    {
        return NULL;
    }
    else
    {
        return plist->pbegin;
    }
}

/* 销毁队列 */
int DestroyQueue(QUEUE_LIST *plist)
{
    int ret = 0;

    if (NULL == plist->pbegin && plist->pend == NULL)
    {
        free(plist);
    }
    else
    {
        ret = DeleteQueueAll(plist);
        if (0 == ret)
        {
            free(plist);
        }
    }

    return 0;
}

/* 测试:遍历 */
int SearchAllQueue(QUEUE_LIST *plist)
{
    QUEUE_NODE *ptmp = plist->pbegin;

    if (NULL == plist->pbegin && NULL == plist->pend)
    {
        printf("NO DATA!\n");
        return -1;
    }
    else
    {
        while (ptmp != NULL)
        {
            printf("%d\n", ptmp->data);
            ptmp = ptmp->pnext;
        }
    }
    printf("len = %d\n", plist->clen);

    return 0;
}

主函数:

#include "head.h"

int main(void)
{
    /* 创建队列标签 */
    QUEUE_LIST *plist = CreateQueueList();
    if (NULL == plist)
    {
        perror("fail to create list");
        return -1;
    }

    /* 入队 */
    /* 创建队列结点 */
    QUEUE_NODE *pnode = CreateQueueNode(1);
    if (NULL == pnode)
    {
        perror("fail to create node");
        return -1;
    }
    JoinQueueNode(plist, pnode);

    pnode = CreateQueueNode(2);
    if (NULL == pnode)
    {
        perror("fail to create node");
        return -1;
    }
    JoinQueueNode(plist, pnode);
    pnode = CreateQueueNode(3);
    if (NULL == pnode)
    {
        perror("fail to create node");
        return -1;
    }
    JoinQueueNode(plist, pnode);
    pnode = CreateQueueNode(4);
    if (NULL == pnode)
    {
        perror("fail to create node");
        return -1;
    }
    JoinQueueNode(plist, pnode);
    pnode = CreateQueueNode(5);
    if (NULL == pnode)
    {
        perror("fail to create node");
        return -1;
    }
    JoinQueueNode(plist, pnode);
    SearchAllQueue(plist);
    printf("=========================\n");

    /* 获取队头数据 */
    pnode = GetQueueBegin(plist);
    if (NULL == pnode)
    {
        perror("this queue no begin\n");
    }
    else
    {
        printf("head data:%d\nhead addr:%p\n", pnode->data, pnode);
        printf("=========================\n");
    }
#if 0
    /* 出队一次一个结点 */
    LeaveQueueNode(plist);
    LeaveQueueNode(plist);
    SearchAllQueue(plist);
    printf("=========================\n");
#endif
#if 1
    /* 清空队列 */
    DeleteQueueAll(plist);
    SearchAllQueue(plist);
    printf("=========================\n");
#endif
    /* 销毁队列 */
    DestroyQueue(plist);

    return 0;
}

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值