[原]数据结构之栈

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

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

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

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

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

[原]数据结构之栈

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

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

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

使用数组实现一个栈:

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

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

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

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


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

查看所有标签

猜你喜欢:

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

计算机程序设计艺术

计算机程序设计艺术

Donald E.Knuth / 黄林鹏 / 机械工业出版社 / 2010-8 / 69.00元

《计算机程序设计艺术(第4卷·第0册):组合算法与布尔函数概论(双语版)》是《计算机程序设计艺术,第4卷:组合算法》的第0册。《计算机程序设计艺术(第4卷·第0册):组合算法与布尔函数概论(双语版)》介绍了组合搜索历史和演化,涉及组合搜索技术的理论和实践应用,探究了布尔函数相关的所有重要问题,考察了如何最有效地计算一个布尔函数的值的技术。本册是《计算机程序设计艺术的》第7章,即组合搜索一长篇宏论的......一起来看看 《计算机程序设计艺术》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具