1.栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。在编程中,例如C/C++中,所有的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就可以把栈中的内容销毁,所以速度最快。
2.堆(Heap)是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程,C/C++分别用malloc/New请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多!但是堆的好处是可以做的很大,C/C++对分配的Heap是不初始化的。
3.在Java中除了简单类型(int,char等)都是在堆中分配内存,这也是程序慢的一个主要原因。但是跟C/C++不同,Java中分配Heap内存是自动初始化的。在Java中所有的对象(包括int的wrapper Integer)都是在堆中分配的,但是这个对象的引用却是在Stack中分配。也就是说在建立一个对象时从两个地方都分配内存,在Heap中分配的内存实际建立这个对象,而在Stack中分配的内存只是一个指向这个堆对象的指针(引用)而已。
4.
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}
5.栈是先进后出的,但是对于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,只要你喜欢。
堆:就是一种表现形式,打个比喻,就是一堆鸡在那里,怎么取怎么拿你可以决定
堆栈:可以看成一只一只鸡排好队进笼,如果一只鸡想退出来,不能乱来,只能最后一只鸡先退出来,前面的鸡才能退。
堆栈数据结构区别
- template < class T >
- class AStack {
- private:
- int size ; // 数组的规模
- T * stackArray ; // 存放堆栈元素的数组
- int top ; // 栈顶所在数组元素的下标
- public:
- AStack ( int MaxStackSize ) // 构造函数
- { size = MaxStackSize ; stackArray = new T [MaxStackSize] ; top = -1 ; }
- ~AStack ( ) { delete [ ] stackArray ; } // 析构函数
- bool Push ( const T& item ) ; // 向栈顶压入一个元素
- bool Pop ( T & item ) ; // 从栈顶弹出一个元素
- bool Peek ( T & item ) const ; // 存取栈顶元素
- int IsEmpty ( void ) const { return top = = -1 ; }
- // 检测栈是否为空
- int IsFull ( void ) const { return top size-1 ; }
- // 检测栈是否为满
- void clear ( void ) { top-1 ; } // 清空栈
- } ;
例子:
int a = 3;
int b = 3;
第一步处理:
- 1
- 2
1.编译器先处理int a = 3;
2.创建变量a的引用
3.在栈中查找是否有3这个值
4.没有找到,将3存放,a指向3
第二步处理:
- 1
- 2
1.处理b=3
2.创建变量b的引用
3.找到,直接赋值
第三步改变:
- 1
- 2
接下来
a = 4;
同上方法
a的值改变,a指向4,b的值是不会发生改变的
PS:如果是两个对象的话,那就不一样了,对象指向的是同一个引用,一个发生改变,另一个也会发生改变