在学习数据结构中,栈、队列、链表是几个比较重要的学习点。如何让数据有序的存储呢,但是在这之前那我们得先学习一些储备知识,那样才会让我们更好的往下学习。
程序内存分配(基础知识)
- 栈(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 其操作如往箱子里面放衣服一样,只有一个出口,后进先出。
- 堆(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。其操作方式如同有出口和入口的景区,先进先出。
- 自由存储区:自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。(这里有点难理解,很多人认为自由存储区和堆是等价的,其实不然)
- 全局存储区(静态存储区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
- 常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
示例描述:
//test.cpp
int a = 0; //全局初始化区
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main() {
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
int* nub = new int;
int* nub1 = new int(5);
//分配在自由存储区 new
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
free(p1); //释放内存
free(p2);
delete nub; //释放内存
delete[] nub1;
}
数据结构:栈
栈:是一种连续存储的数据结构,特点是存储的数据先进后出。我们把表尾称作栈顶(top),相应的,表头称作栈底(bottom),由栈的特性可知,栈是一种后进先出(LIFO)的线性表,只能在栈顶进行插入和删除。包括:栈、链栈。
使用STL容器基于数组的栈操作:
#include <stack>
#include <iostream>
using namespace std;
int main()
{
stack<int> Nstack;
int sum = 0;
for (int i = 0; i <= 10; i+&