博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构之栈
阅读量:3900 次
发布时间:2019-05-23

本文共 1613 字,大约阅读时间需要 5 分钟。

什么是栈

栈是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。一句话描述栈的特性就是先进后出

如何实现栈

实现一个栈我们一般有两种方法:

顺序结构

顾名思义,就是使用数组来实现栈的特性。数组实现简单,我们只需要预先定义好数组的大小、在数组的末尾进行元素的入栈操作或者出栈操作即可。时间复杂度为 O(1)。但是我们栈的大小有限,动态调整栈大小的代价较高,且要求有连续的地址空间。

链式结构

我们可以使用链表来实现。我们在进行出栈操作和入栈操作的时间复杂度都是 O(1)。同时可以动态的管理栈的大小。

栈的实现

元素节点定义(这是展示的是链表实现的方式):

#include 
#include
// 栈节点元素typedef struct Node{ /* data */ int val; struct Node *next; struct Node *prev;} Node;// 头节点元素Node *head = NULL;// 记录栈元素的数量int size = 0;

栈的初始化操作

void init(){    head = NULL;    size = 0;}

入栈操作

void push(int val){    Node *node = (Node *)malloc(sizeof(Node));    node->val = val;    node->prev = node->next = NULL;    if (head == NULL)    {        head = node;    }    else    {        head->next = node;        node->prev = head;        head = node;    }    size++;}

出栈操作

int pop(){    if (head == NULL)    {        return 0xFFFFFF;    }    Node *old = head;    head = head->prev;    if (head != NULL)    {        head->next = NULL;    }    old->prev = NULL;    int val = old->val;    size--;    free(old);    return val;}

获取栈容量

int stackSize(){    return size;}

启动函数

int main(){    init();    push(1);    push(2);    printf("%d\n", pop());    printf("%d\n", pop());    printf("%d", stackSize());    return 0;}/*210*/

栈的应用

栈在计算机中十分常见。比如我们写代码的递归就会使用到栈。浏览器页面的前进后退都会使用到栈。可见栈的的重要性还是比较高的,需要我们好好掌握。后续有时间会结合栈和算法写一篇文章,欢迎阅读。

数据结构中相关的代码我已上传到 gitlab:

此后的数据结构代码我都会上传在这个仓库中,需要的同学可以自己下载

以上就是本期的全部内容。在这里给大家拜个早年,祝大家新的一年牛气冲天!

感谢你能看到这里,欢迎关注我的微信公众号:BitLegend,学习更多的知识!我们下期再见!

转载地址:http://etden.baihongyu.com/

你可能感兴趣的文章
记一次数据推送的异常解决端口解决
查看>>
linux、mysql、nginx、tomcat 性能参数优化
查看>>
Nginx使用Linux内存加速静态文件访问
查看>>
杀掉nginx进程后丢失nginx.pid,如何重新启动nginx
查看>>
nginx另类复杂的架构
查看>>
Nginx流量复制/AB测试/协程
查看>>
使用NTP服务器完美解决VMware Linux时间无法同步问题
查看>>
机器学习笔记(3)---K-近邻算法(1)---约会对象魅力程度分类
查看>>
机器学习笔记(4)---K-近邻算法(2)---使用sklearn中的KNN算法
查看>>
数据结构——外部排序
查看>>
UNIX网络编程——System V 消息队列
查看>>
信号量、互斥锁,读写锁和条件变量的区别
查看>>
UNIX网络编程——Posix共享内存区和System V共享内存区
查看>>
js循环语句
查看>>
js中时钟的写法
查看>>
js事件冒泡
查看>>
50道!2020年!!MySQL高频数据库面试题解析,你都懂了吗?
查看>>
如何用Spring Boot加密配置文件中的特殊内容示例代码详解
查看>>
谈谈这些年面试官给大伙下的那些套,如何解?(面试技巧)
查看>>
5年开发经验的我被几条朋友圈打击到,点燃自己冲击阿里面经!
查看>>