数据结构:栈和队列

目录

顺序栈

结构体

创建

判断是否满栈

判断是否是空栈

入栈

出栈

遍历打印

销毁

链式栈

入栈:

出栈:

队列

链式队列

入队列:

出队列:


栈和队列

栈:

FILO

先进后出,后进先出 (等同于水杯)

栈顶:允许入栈出栈的一端称为栈顶

栈底:不允许入栈和出栈的一端称为栈底

入栈(压栈):将数据元素放入栈顶

出栈(弹栈):将数据元素从栈顶位置取出

分类:空增栈

空减栈

满增栈

满减栈

顺序栈

结构体

typedef int DataType;
typedef struct stack
{
    DataType *data;
    int top;
    int tlen;
}SeqStack;

创建

SeqStack *CreateSeqStack(int Maxlen)
{

    //申请标签空间
    SeqStack *stack=NULL;
    stack=malloc(sizeof(SeqStack));
    if(stack==NULL)
    {
        return NULL;
    }
    //为每个成员赋值
    stack->tlen=Maxlen;
    stack->top=0;
 
    //申请存放数据的空间
    stack->data = malloc( Maxlen *sizeof(DataType));
    if(stack->data==NULL)
    {
        return NULL;
    }
    //返回标签地址
    return stack;
}

判断是否满栈

int IsFullSeqStack(SeqStack *pTmpStack)
{
    return pTmpStack->top==pTmpStack->tlen?1:0;
}

判断是否是空栈

int IsEmptySeqStack(SeqStack *pTmpStack)
{
    return pTmpStack->top==0?1:0;
}

入栈

在栈的top处添加新元素,top再++

int PushSeqStack(SeqStack *pTmpStack, DataType TmpData)
{
    if(IsFullSeqStack(pTmpStack))
    {
        return -1;
    }
    pTmpStack->data[pTmpStack->top]=TmpData;
    pTmpStack->top++;
}

出栈

每次是top-1处出栈

DataType PopSeqStack(SeqStack *pTmpStack)
{
    if(IsEmptySeqStack(pTmpStack))
    {
        return -1;
    }
    DataType pTmpdata= pTmpStack->data[pTmpStack->top-1];
   
    pTmpStack->top--;
    return pTmpdata;
}

遍历打印

int ForEachSeqStack(SeqStack *pTmpStack)
{
    int i=0;
    for(i=pTmpStack->top;i>0;i--)
    {
        printf("%d  ",pTmpStack->data[pTmpStack->top-1]);
        pTmpStack->top--;
    }
    return 0;
}

销毁

int DestroySeqStack(SeqStack **ppTmpStack)
{
    free((*ppTmpStack)->data);
    free((*ppTmpStack));
    (*ppTmpStack)=NULL;
}

链式栈

入栈:

直接使用头插法插入链表

出栈:

每次都出(删除)第一个节点

#include  "list.h"
#include <stdio.h>
typedef struct data
{
    struct list_head node;
    int data;
}data_t;
int main()
{
    struct list_head pHead;
    struct list_head *pTmpNode=NULL;
    INIT_LIST_HEAD(&pHead);
    data_t d[5]={
        {{NULL,NULL},1},
        {{NULL,NULL},2},
        {{NULL,NULL},3},
        {{NULL,NULL},4},
        {{NULL,NULL},5},
    };
    //头插法插入链表
    for(int i=0;i<5;i++)
    {
         list_add(&d[i].node,&pHead);
    }
    //链表不为空,第一个元素出栈
    while(!list_empty(&pHead))
    {
        pTmpNode=pHead.next;
        /*list_entry利用node偏移量获得整个节点的地址(pTmpNode的地址-node的偏移量)*/
        printf("%d ",list_entry(pTmpNode,data_t,node)->data);
        list_del(pTmpNode);
    }
    printf("\n");
    return 0;
}

队列

先入先出,后入后出(等同于排队)

链式队列

入队列:

使用尾插法入队

出队列:

每次出(删除)第一个节点

#include "list.h"
#include <stdio.h>
typedef struct data
{
    struct list_head node;
    int data;
}data_t;
int main()
{
    struct list_head phead;
    struct list_head *pTmpNode=NULL;
    INIT_LIST_HEAD(&phead);
    data_t data[5]={
        {{NULL,NULL},1},
        {{NULL,NULL},2},
        {{NULL,NULL},3},
        {{NULL,NULL},4},
        {{NULL,NULL},5},
    };
//使用尾插法入队列
    for(int i=0;i<5;i++)
    {
        list_add_tail(&data[i].node,&phead);
    }
//出队列每次都是第一个节点出
    while(!list_empty(&phead))
    {
        pTmpNode=phead.next;
        printf("%d  ",list_entry(pTmpNode,data_t,node)->data);
        list_del(pTmpNode);
    }
    printf("\n");
    return 0;
    
}
相关推荐
passer__jw76738 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
脉牛杂德2 小时前
多项式加法——C语言
数据结构·c++·算法
一直学习永不止步2 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
wheeldown10 小时前
【数据结构】选择排序
数据结构·算法·排序算法
躺不平的理查德14 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
阿洵Rain14 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法
Leo.yuan15 小时前
39页PDF | 华为数据架构建设交流材料(限免下载)
数据结构·华为
半夜不咋不困15 小时前
单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构
数据结构·链表