当前位置: 首页 > news >正文

数据结构与算法—栈stack

目录

栈的复杂度

空间复杂度O(1)

时间复杂度O(1)

栈的应用

1、栈在函数调用中的应用;

2、栈在求表达式的值的应用:

栈的实现


        后进先出,先进后出,只允许在一端插入和删除

从功能上,数组和链表可以代替栈。特定的数据结构是对特定场景的抽象,而且数组或链表暴露接口过多,自然容易出错。

符合先进后出特性的数据,可以使用栈

栈的形式

  • 1、顺序栈 数组实现
  • 2、链式栈 链表实现

栈的复杂度

空间复杂度O(1)

        出栈和入栈只需要两个临时变量存储空间,空间复杂度O(1),存n个数据,不能说时间复杂度O(n),因为n个空间是必须的。出来原本的空间,算法还需要额外的存储空间

时间复杂度O(1)

        时间复杂度 O(1),插入在满的时候会退化O(n),平摊也是O(1)

动态扩容的栈

栈满,申请更大数组,将原来数据搬到新数组中。

栈的应用

1、栈在函数调用中的应用;

        为什么函数调用要用“栈”来保存临时变量呢?用其他数据结构不行吗? 其实,我们不一定非要用栈来保存临时变量,只不过如果这个函数调用符合后进先出的特性,用栈这种数据结构来实现,是最顺理成章的选择。

        从调用函数进入被调用函数,对于数据来说,变化的是什么呢?是作用域。所以根本上,只要能保证每进入一个新的函数,都是一个新的作用域就可以。而要实现这个,用栈就非常方便。在进入被调用函数的时候,分配一段栈空间给这个函数的变量,在函数结束的时候,将栈顶复位,正好回到调用函数的作用域内。

2、栈在求表达式的值的应用:

编译器通过两个栈来实现。一个存值,一个存操作数。

比较运算符栈顶元素的优先级,高则将当前运算符压如栈;低或者相同,从运算符栈中取出栈顶运算符。从操作数中取出两个数,进行计算,计算后再将结果压入操作数栈,继续比较。

栈的实现

typedef struct _array_stack
{int size;int pos;int *array;
}arrayStack;   arrayStack *arrayStack_create(int size)
{arrayStack *pStack = NULL;pStack = (arrayStack *)malloc(sizeof(arrayStack));if(pStack == NULL)return NULL;pStack->size = size;pStack->pos = -1;pStack->array = (int *)malloc(sizeof(int)*size);if(pStack->array ==NULL){free(pStack);return NULL;}return pStack;
}int arrayStack_pop(arrayStack *pStack)
{int data = 0;if(arrayStack_is_empty(pStack)){return -1;}data = pStack->array[pStack->pos];pStack->pos--;return data;
}
int arrayStack_push(arrayStack *pStack,int data)
{if(arrayStack_is_full(pStack))return;pStack->pos++;pStack->array[pStack->pos] = data;return 0;
}

http://www.lryc.cn/news/20474.html

相关文章:

  • 【学习笔记】[ARC150F] Constant Sum Subsequence
  • Node.js实现大文件断点续传—浅析
  • Spring Cloud Nacos源码讲解(九)- Nacos客户端本地缓存及故障转移
  • MySQL知识点小结
  • MySQL关于NULL值,常见的几个坑
  • OllyDbgqaqazazzAcxsaZ
  • Elasticsearch7.8.0版本进阶——自定义分析器
  • spring事务-创建代理对象
  • Linux 配置NFS与autofs自动挂载
  • 【编程入门】应用市场(Python版)
  • 异常信息记录入库
  • Spring Batch 高级篇-分区步骤
  • ES数据迁移_snapshot(不需要安装其他软件)
  • 【Vue3 第二十章】异步组件 代码分包 Suspense内置组件 顶层 await
  • 「媒体邀约」四川有哪些媒体,成都活动媒体邀约
  • @Autowired和@Resource的区别
  • Linux系列:glibc程序设计规范与内存管理思想
  • Redis 集群
  • EF 框架的简介、发展历史;ORM框架概念
  • 注解原理剖析与实战
  • 《STL源码剖析》理解之将类成员函数和for_each等算法结合
  • 如何构建应用标准化体系
  • 【RabbitMQ笔记03】消息队列RabbitMQ七种模式之WorkQueues工作队列模式
  • 认识html
  • 在外包公司熬了 3 年终于进了字节,竭尽全力....
  • 绝对让你明明白白,脚把脚带你盯着 I2C 时序图将 I2C 程序给扣出来(基于STM32的模拟I2C)
  • 2023年全国最新工会考试精选真题及答案5
  • 一文2000字手把手教你自动化测试Selenium+pytest+数据驱动
  • windows安装Ubuntu子系统以及图形化界面记录
  • 通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理。Python DES实现源码