栈与堆栈的区别

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.栈是先进后出的,但是对于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,只要你喜欢。

堆:就是一种表现形式,打个比喻,就是一堆鸡在那里,怎么取怎么拿你可以决定
堆栈:可以看成一只一只鸡排好队进笼,如果一只鸡想退出来,不能乱来,只能最后一只鸡先退出来,前面的鸡才能退。

堆栈数据结构区别

[sql]  view plain  copy
  1. template < class T >    
  2. class AStack {    
  3. private:    
  4. int size ; // 数组的规模    
  5. T * stackArray ; // 存放堆栈元素的数组    
  6. int top ; // 栈顶所在数组元素的下标    
  7. public:    
  8. AStack ( int MaxStackSize ) // 构造函数    
  9. size = MaxStackSize ; stackArray = new T [MaxStackSize] ; top = -1 ; }    
  10. ~AStack ( ) { delete [ ] stackArray ; } // 析构函数    
  11. bool Push ( const T& item ) ; // 向栈顶压入一个元素    
  12. bool Pop ( T & item ) ; // 从栈顶弹出一个元素    
  13. bool Peek ( T & item ) const ; // 存取栈顶元素    
  14. int IsEmpty ( void ) const { return top = = -1 ; }    
  15. // 检测栈是否为空    
  16. int IsFull ( void ) const { return top   size-1 ; }    
  17. // 检测栈是否为满    
  18. void clear ( void ) { top-1 ; } // 清空栈    
  19. } ;    

例子: 
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:如果是两个对象的话,那就不一样了,对象指向的是同一个引用,一个发生改变,另一个也会发生改变


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值