[原]数据结构之栈

栏目: 数据库 · 发布时间: 5年前

内容简介:本篇是数据结构与算法之美学习笔记栈是一种特殊的线性表,仅能在线性表的一端操作数据,只允许在栈顶操作,特性:后进先出。从上面的定义可以看出,栈主要包括两个操作,入栈和出栈,也就是从栈顶插入一个数据,和从栈顶删除一个数据。那怎么来实现一个栈呢?

本篇是数据结构与算法之美学习笔记

栈是一种特殊的线性表,仅能在线性表的一端操作数据,只允许在栈顶操作,特性:后进先出。

就像我们往一个盒子里放东西,最先放的东西总是在下面,往外拿的时候,先拿到最后放进去的。

[原]数据结构之栈

当某个数据集合,只涉及在一端插入和删除数据,并且满足后进先出的特性,这时候首选栈这种数据结构。

从上面的定义可以看出,栈主要包括两个操作,入栈和出栈,也就是从栈顶插入一个数据,和从栈顶删除一个数据。那怎么来实现一个栈呢?

栈可以用数组来实现也可以用链表来实现,用数组实现的栈叫顺序栈,用链表实现的栈叫链式栈、

使用数组实现一个栈:

public class ArrayStack {
    private String[] items;
    private int count;//栈中的元素的个数
    private int n;//栈的总大小

    public ArrayStack(int n) {
        this.n = n;
        this.items = new String[n];
        this.count = 0;
    }

    //入栈操作
    public boolean push(String item){
        //如果栈满了,直接返回false
        if(count == n) return false;
        items[count] = item;
        ++count;
        return true;
    }

    //出栈操作
    public String pop(){
        //如果栈为空 返回null
        if(count == 0) return null;
        String tmp = items[count-1];
        --count;
        return tmp;
    }

}

上面是实现的一个固定大小的栈,在创建栈的时候需要制定栈的大小,栈满了之后就无法再往里面添加数据了,虽然使用链式栈大小不受限制,但是需要存储next指针,内存消耗比较多。那么怎么使用数组实现一个可以动态扩容的栈呢?

我们先看数组动态扩容的原理:当数组的空间不够的时候,就重新申请一块更大的内存,把原来的数组中数据全部拷贝过去。

所以想要实现一个可动态扩容的栈,让其底层依赖一个可动态扩容的数组就可以了。

函数调用栈:

操作系统给每个线程分配了一块独立的内存空间,这块内存空间被组织成‘栈’这种结构,用来存储函数调用时的临时变量。每进入一个函数,就会把临时变量作为一个栈帧入栈,当被调用函数执行完成之后,把这个函数对应的栈帧出栈。

比如下面的函数

public int main(){
       int a = 1;
       int res = 0;
       int ret = 0;
       ret = add(5,6);
       res = a + ret;
       System.out.println("res"+res);
       return  res;
    }

    public int add(int x ,int y){
        int sum = 0;
        sum = x + y;
        return sum;
    }

从上面代码可以看到,main()方法调用了add()函数,并且与临时变量a相加。最后打印出res并返回。

main栈帧:a = 1,res = 0,ret = 0

add栈帧: x = 5,y = 6,sum = 0

为什么函数调用要用“栈”来保存临时变量呢?用其他数据结构不行吗?

因为函数调用符合后进先出的特性,使用栈这种数据结构来实现比较好

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


以上所述就是小编给大家介绍的《[原]数据结构之栈》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

天使投资

天使投资

唐滔 / 浙江人民出版社 / 2012-4-30 / 56.99元

1.国内首部天使投资的实战手册,堪称创业者的第一本书,打造创业者与天使投资人沟通的最佳桥梁。 2. 薛蛮子、徐小平、雷军、周鸿祎、孙陶然、但斌、曾玉、查立、杨宁、户才和、周哲、莫天全、《创业家》、《创业邦》等联袂推荐。 3.作者唐滔结合他在美国和中国17年的创业和投资经历,为创业者和投资者提供了珍贵和可靠的第一手资料。 4.创业者应何时融资?花多少时间去融资?如何获得融资者青睐?......一起来看看 《天使投资》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具