【数据结构】之栈(C语言)

简介: 【数据结构】之栈(C语言)

回顾

顺序表和链表的区别和联系

顺序表:

​ 优点:空间连续支持随机访问。

​ 缺点:1.中间或前面的插入删除时间复杂度O(N)。

​ 2.增容的代价比较大

链表(带头双向循环):

​ 缺点:

​ 以借点为单位存储,不支持随机访问。

​ 优点:

​ 1.任意位置插入删除时间复杂度为O(1)

​ 2.没有增容消耗,按需申请结点空间,不用了直接释放。


栈也是线性表,在逻辑上还是挨着放的。

栈的概念以及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,
入数据在栈顶

出栈:栈的删除操作叫做出栈。
出数据也在栈顶

在这里插入图片描述

实现方式:

  1. 数组实现

在这里插入图片描述

总结:

相当于之前顺序表的尾插尾删,用尾做栈顶,非常合适,唯一缺陷就是,空间不够需要增容(影响不大)。

(顺序表——【线性表】之顺序表_半生瓜のblog-CSDN博客)

  1. 链表实现

在这里插入图片描述

出数据得找到前一个,这样的话用双向链表更好一些。

(所以说数据结构并没有规定用什么方法实现,只要能实现就行,对比的就是效率而已。)

也可以将单链表反过来。

在这里插入图片描述

总结:

​ 如果用尾插做栈顶,用双向链表更好。

​ 如果用单链表实现,就用头去做栈顶,这样入栈和出栈效率都是O(1)。

​ 整体来说数组的效率更优一些。


结构定义

typedef int StackDataType;
typedef struct Stack
{
    StackDataType* arry;
    int top;//指向栈顶
    int capacity;//栈的容量——能放几个数据
}Stack;

初始化

如果初识的top给0,意味着top指向栈顶的元素的下一个,top给-1,top指向栈顶元素。

一定不能为空的东西,可以使用断言来处理。OJ题不可以使用断言。

void StackInit(Stack* ps)
{
    assert(ps);
    ps->arry = (StackDataType*)malloc(sizeof(StackDataType)*4);
    if (ps->arry == NULL)
    {
        printf("malloc fail");
        exit(-1);
    }
    ps->capacity = 4;
    ps->top = 0;
}

销毁

void StackDestory(Stack* ps)
{
    assert(ps);
    free(ps->arry);
    ps->arry = NULL;
    ps->top = ps->capacity =0 ;
}

入栈

void StackPush(Stack* ps, StackDataType x)
{
    assert(ps);
    //满了
    if (ps->top == ps->capacity)
    {
        StackDataType* tmp = (StackDataType*)realloc(ps->arry, ps->capacity * 2 * sizeof(StackDataType));
        if (tmp == NULL)
        {
            printf("realloc fail");
            exit(-1);
        }
        else
        {
            ps->arry = tmp;
            ps->capacity *= 2;
        }
    }
    ps->arry[ps->top] = x;
    ps->top++;
} 

出栈

void StackPop(Stack* ps)
{
    assert(ps);
    //如果栈空了调用top,直接终止程序报错
    assert(ps->top > 0);
    ps->top--;
}

返回栈顶元素

StackDataType StackTop(Stack* ps)
{
    assert(ps);
    assert(ps->top > 0);
    return ps->arry[ps->top - 1];
}

返回栈中元素个数

int StackSize(Stack* ps)
{
    assert(ps);
    return ps->top;
}

判断栈是否为空

bool StackEmpty(Stack* ps)
{
    assert(ps);
    return ps->top == 0;//真为空,假为非空。
}

小提示:

上面有的函数只有两行代码,如果直接用里面的那句代码,可以吗?
可以,但是不好,通过那句代码访问到,但严格来说你不应该去访问,这是一种耦合,耦合就是一种强关联,
调用函数,无需去想top在0还是在-1,只管用就完事了。(有点软件工程的思想)


调用

int main(void)
{    
    Stack ps;
    StackInit(&ps);
    StackPush(&ps,1);
    StackPush(&ps,2);
    StackPush(&ps,3);
    while (!StackEmpty(&ps))
    {
        printf("%d ", StackTop(&ps));
        //取完栈顶的数据,想取下一个,那就得删一下
        StackPop(&ps);
    }
    printf("\n");
    StackDestory(&ps);
    return  0;
}
相关文章
|
14天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
5天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
14 1
|
8天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
13天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
56 16
|
13天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
62 8
|
11天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
13天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
40 4
|
16天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
44 4
|
17天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
49 3
|
17天前
|
存储 算法 C语言
C语言数据结构(2)
【10月更文挑战第21天】

热门文章

最新文章