Fangjian

FE / 生活是一种态度

导航
 » 主页
 » 项目
 » Github
 » 关于我

栈 [js]

11 Mar 2015 » js

stack(栈) 是编程语言中最重要的概念之一,本文主要是说明栈的含义,个人在编程的过程中对栈的概念总是很含糊

1.数据结构 LIFO

数据的存放方式 LIFO(last in first out)

在数据结构中称为栈,先加入(push)栈的数据放在最下面,后加入的数据放在最上面,使用的时候先取出(pop)最上层的数据,也就是最后加入的数据.

涉及到的一些操作:

- push:在最顶层加入数据。

- pop:返回并移除最顶层的数据。

- top:返回最顶层数据的值,但不移除它。

- isempty:返回一个布尔值,表示当前stack是否为空栈。

2.代码运行方式 call stack

调用栈(call stack),表示函数或子程序像堆放积木一样存放,实现层层调用


class Student{
    int age;              
    String name;      

    public Student(int Age, String Name)
    {
        this.age = Age;
        setName(Name);
    }
    public void setName(String Name)
    {
        this.name = Name;
    }
}

public class Main{
    public static void main(String[] args) {
            Student s;           
            s = new Student(23,"Jonh");
    }
}

上面这段代码运行的时候,首先调用main方法,里面需要生成一个Student的实例,于是又调用Student构造函数。在构造函数中,又调用到setName方

     setName()
        |
     Student()
        |
      main()

这三次调用像积木一样堆起来,就叫做"调用栈"。程序运行的时候,总是先完成最上层的调用,然后将它的值返回到下一层调用,直至完成整个调用栈,返回最后的结果。


3.内存区域

存放数据的一种内存区域

程序运行时,需要内存空间存放数据,一般来说,系统会划分出两种不同的内存空间 1. stack(栈) 2.heap(堆)

区别:

  • 栈是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小。堆是无结构的,数据可以任意存放 so 栈的寻址速度快于堆

  • 一般来说每个线程分配一个stack,每个进程分配一个heap。因此stack是独占的,heap是共享的。stack创建的时候,大小是确定的,数据超过这个大小,就会发生stackoverflow错误,而heap的大小是不确定的,需要的话可以不断增加。

只要是局部的,占用空间确定的数据,都存放在stack

// java

class Test {
  public void main(String[] args){
      int i = 4;
      int y = 2;
      Person p1 = new Person('wfj', 1);
  }
}


class Person {
  private String name;
  private int id;
  
  public Person(name, id){
    this.name = name;
    this.id = id;
  }
}

当 main 方法运行结束,会发生什么事?

回答是整个stack被清空,i、y和cls1这三个变量消失,因为它们是局部变量,区块一旦运行结束,就没必要再存在了。而heap之中的那个对象实例继续存在,直到系统的垃圾清理机制(garbage collector)将这块内存回收。因此,一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却因为种种原因,没有被系统回收。


文献:

Stack的三种含义

相关文章