2 qq 34119437 qq_34119437 于 2016.04.25 02:39 提问

关于c/c++里面栈,队列,堆的问题

学了好久,也听老师说了,但是始终不明白栈,堆,队列是啥,我想知道这些究竟是抽象概念 还是实际意义上存在的东西?求大神解惑,给点例子最好,谢谢各位啦。

5个回答

caozhy
caozhy   Ds   Rxr 2016.04.25 03:31

看你从什么层面去理解它们。它们当然是实际存在的东西,但是不等于说实际层面的东西就必须理解。好比计算机的晶体管是实际存在的东西,但是对于程序员来说,就基本没有去理解它们的必要。

堆栈、队列、堆是一些抽象的数据结构,这种抽象恰恰是它的存在的实际意义——越抽象的东西才运用越广泛。数学就是抽象的,所以数学才能解决一切问题。方程比算术抽象,所以小学生做题需要分为“植树问题”“鸡兔同笼”“行程问题”……而这些问题用方程去解决就是一个问题。再比如微积分比代数更抽象,所以中学里面研究面积、体积、双曲线、抛物线……这些问题都可以用微积分解决……超越代数、群论比微积分又更抽象,但是能解决的问题就更广泛。对应的,你可以在计算机科学的很多场合,甚至可以说几乎所有场合看到栈,队列,堆。比如用于组织内存的函数堆栈和内存堆,用于操作系统任务调度的作业队列、消息队列,堆排序算法中的优先级队列,广度优先搜索中的遍历节点堆栈,等等。

所以归根结底,看你从什么角度看,如果你深入去研究,那么你必然要接触科学的两头——抽象和具体。如果你只是一个普通的技术工人,那么哪一头都和你无关。

renwotao2009
renwotao2009   2016.04.25 07:47

看定义之后,你会发现它们都是容器,存放变量的容器,栈后放进去,先出来,队列就相当于排队,队首先出,一个接一个;堆就是一块空间可以由用户申请的空间,就像超市的储物箱,你用几个,走的时候记得拿走东西,还回储物箱

Rewen
Rewen   2016.04.25 08:21

栈,队列,堆 都是为了管理内存的一组规则,就如交通规则一样。
在实际存在的都是马路,但是为了行车方便,人为的制定了很多交通规则。
在实际运行中存在的就是内存,为了程序的运行方便,也制定了栈,队列,堆的内存管理规则。

qq_23963463
qq_23963463   2016.04.25 10:28

作为一个同样的菜鸟,推荐你去用具体代码实现这几种存储方式,个人感觉还是具体的代码模型能够更好的理解这种概念

sinzen
sinzen   2016.04.25 09:44

就当它是对数据的一个管理方法而已。
堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。
C/C++
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。
2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、静态区(static)—全局变量和局部静态变量的存储是放在一块的。程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的,程序结束后由系统释放 。
5、程序代码区— 存放函数体的二进制代码。
变量的存储方式
存储描述 持续性 作用域 链接性 如何声明
自动 自动 代码块 无 在代码块中
寄存器 自动 代码块 无 在代码块中,使用关键字 register
静态,无链接性 静态 代码块 无 在代码块中,使用关键字 static
静态,外部链接性 静态 文件 外部 不在任何函数内
静态,内部链接性 静态 文件 内部 不在任何函数内,使用关键字 static
首先,定义静态变量时如果没有初始化编译器会自动初始化为0.。接下来,如果是使用常量表达式初始化了变量,则编译器仅根据文件内容(包括被包含的头文件)就可以计算表达式,编译器将执行常量表达式初始化。必要时,编译器将执行简单计算。如果没有足够的信息,变量将被动态初始化。请看一下代码:

int global_1=1000;//静态变量外部链接性常量表达式初始化
int global_2;//静态变量外部链接性零初始化
static int one_file_1=1000;//静态变量内部链接性常量表达式初始化
static int one_file_2;//静态变量内部链接性零初始化
int main()
{
static int count_1=1000;//静态变量无链接性常量表达式初始化
static int count_2;//静态变量无链接性零初始化
return 0;
}

所有的静态持续变量都有下述初始化特征:未被初始化的静态变量的所有位都被设为0。这种变量被称为零初始化。以上代码说明关键字static的两种用法,但含义有些不同:用于局部声明,以指出变量是无链接性的静态变量时,static表示的是存储持续性;而用于代码块外声明时,static表示内部链接性,而变量已经是静态持续性了。有人称之为关键字重载,即关键字的含义取决于上下文。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!