C++中堆,栈,队列
C/C++内存分为五个部分:
1、栈区(stack):存放函数的参数值,局部变量的值等(编译器自动分配释放 )。
2、堆区(heap): 注意:与数据结构中的堆完全不同,分配方式类似于链表(程序员分配释放,若程序员不释放,程序结束时可能由OS回收 )。
3、全局区(静态区):全局变量和静态变量存储在一块,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(程序结束后由系统释放)。
4、文字常量区:常量字符串就是存储在这里(程序结束后由系统释放)。
5、程序代码区:存放函数体的二进制代码。
在unix环境高级编程一书中,对于栈和堆是这样定义的:
栈:自动变量以及每次函数调用是所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息(例如某些机器寄存器的值)都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用c函数。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
堆:通常在堆中进行动态存储分配,由于历史上形成的惯例,堆位于非初始化数据段和栈之间。
栈和队列头文件:
#include <stack>
#include<queue>
栈:
stack<int> curStack; //栈定义
操作:
curStack.empty() 如果栈为空返回true,否则返回false;
curStack.size() 返回栈内元素的大小;
curStack.pop() 从栈顶弹出一个成员;
curStack.push() 向栈内压入一个成员;
curStack.top() 返回栈顶,但不删除成员;
队列:
queue<int> curQueue; //队列定义
操作:
curQueue.empty() 如果队列为空返回true,否则返回false;
curQueue.size() 返回队列内元素的大小;
curQueue.pop() 从队列弹出一个成员;
curQueue.push() 向队列压入一个成员;
curQueue.front() 返回到队首,但不删除成员;
curQueue.back() 返回到队尾,但不删除成员;
堆、栈、队列之间的区别是?
①堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。
②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)
③队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)