Ⅰ 什么是栈存储区
在C++中,内存分成4个区,他们分别是堆,栈,静态存储区和常量存储区
1、栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存
储区.里面的变量通常是局部变量,函数参数等.
2、堆,又叫自由存储区,它是在程序执行的过程中动态分配的,它最大的特性就是动.
态性.由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,
一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,
操作系统会自动回收.如果分配了堆对象,却忘记了释放,就会产生内存泄漏.而
如果已释放了对象,却没有将相应的指针置为NULL,该指针就是"悬挂指针".
3、静态存储区.所有的静态对象,全局对象都于静态存储区分配.
4、常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
(当然,你要通过非正当手段也可以修改,而且方法很多)
常量字符串都存放在静态存储区,返回的是常量字符串的首地址.
Ⅱ 栈和队列可不可以使用散列存储
栈和队列都属于一位链表,栈是后进先出,进和出都是在同一端进行,就好像一筒羽毛球,只有把上面拿出来,下面的才能拿出来;队列是先进先出的,进和出分别在不同的端进行,比如排队的人,排在前面的人先到柜台办理业务,后面来的人后得到服务。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底。
最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
(2)用栈存储信息扩展阅读:
在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。
栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。
Ⅲ 结合栈的特点,讲一讲在进行函数调用时,为什么要用栈来保存调用函数的信息
一层的调用不明显,但是你考虑一下多层的调用就容易明白了。
比如说,我在函数A中还要调用其他函数,那么这个时候先要把函数A一些变量的信息记录下来,就是存在栈中,然后再调用新的函数(也可以是自身)。等A调用的函数运行完获得返回值时,会回到最初调用它的函数(也就是A),这个时候函数A可能还要继续运行,也可能直接就return了,无论哪种情况都需要把之前存在栈中的信息pop出来,否则一调用其他函数,A自己原先的变量数据就无法跟踪记录了。
Ⅳ 为什么栈里要存放数据呢
肯思考就好,但是你的理解明显有误区。
栈的表层意思很多人都会说但是具体实现的细节要很深,我说说我的理解吧。
首先栈的实现不是物理实现,没有电脑设计会专门设计一个栈,电脑只需要提供什么呢?内存。
从电脑设计者来说他们给电脑一个内存,这个你应该知道,2GB 4GB 或者8GB 每个内存有一个地址。
然后要知道如果你没有接触硬件,你平时接触的地址都是物理地址,比如你有一个指针,指向地址0x12345,不要以为就是对应内存中的这个地址,实际上这个地址只是虚拟地址,至于这个地址究竟实际对应哪里呢,那就是操作系统的事了,操作系统的内存管理单元负责内存映射,比如操作系统知道实际内存 0x23456空闲,就把你的0x12345对应成0x23456这叫做内存的映射。
然后你要知道,操作系统为了软件的 内存不冲突对每个运行的进程一个独立的4GB内存,不管你实际内存是2GB 8GB 这就是抽象和物理的脱离。每个软件只需要知道我可以用1-4GB的内存地址,至于在物理上对应什么就是操作系统的事了,操作系统保证不会独立,这个实现是很简单的。
理解了上面那些就可以说栈了。栈就是一段内存,但是他的实现不是你理解的那样,我这么说你看能听懂不,到了汇编代码这一层,已经不是你理解的那种逻辑了,也许在你想来只是一步但是汇编代码要好多指令,电脑里有这么几个寄存器(你知道是什么吧) esp 表示栈顶的地址 ebp 表示栈底的地址。两条指令 push 表示入栈 也就是esp的值-4 pop 表示出栈esp+4 每一个函数有自己的栈,比如开始的main是一个栈,然后里面调用了一个function1函数又是一个栈,但是这些栈并不是分散的,他们实际是一段连续的地址,只需要在每个程序的栈起始位置记录下来就把它们区分开了。当这个函数结束了他的栈正好被用完,然后就会使调用者的栈(栈的算法可以实现这一点)。
但是栈的地址到底是什么呢,其实栈只需要一个起始地址,然后当需要的时候地址值逐渐减小,需要多少有多少,如果你需要的太多那就会出现栈被耗尽的错误。
那么栈究竟是被谁创建的呢,这个你要知道PE文件你要知道加载器,双击一个.exe文件你会发现他被运行了,为什么呢?首先要操作系统为他分配4GB的内存以及一些其他的初始化,在这个过程中栈被建立了。这些都是加载器做的。
至于什么是加载器呢,这个我真不知道,我没有见过一个程序的名字叫什么load.exe,所以加载器应该是通过动态链接实现的,并没有具体的程序。
最后给你个意见,没有必要一下子走这么深,如果没有基础,你看这些也觉得一头雾水,最好是从头看起,看看操作系统的工作原理。
PS我说的是windows下的。
Ⅳ 如何用堆栈队列知识,存储信息java
程序=数据结构+算法
队列和堆栈就是一种数据结构了,其他的还有链表、树等,是一种存储数据的形式。
堆栈就是实现先进后出的数据结构,比如一端开口一端有底瓶子里,你把饼干(数据)从左端放入瓶子中,拿饼干也要从左端拿,而先放入的饼干最后才能取出。
队列就是实现先进先出的数据结构,比如一个两端都开口的瓶子,你把饼干从左端放入瓶子,拿饼干可以从右端拿出,先放入的饼干最先取出
Ⅵ 在什么情况下可以用栈来存储数据
栈:特点就是一个先进后出的结构。
栈的应用:非常广泛,在CPU内部就有提供栈这个机制。主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。
在CPU内部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。在编程语言中:主要用来进行函数的调用和返回。
可以说在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,所以栈是计算机中不可缺的机制。
Ⅶ 栈的存储结构
栈同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构。
栈的具体实现
栈是一种 "特殊" 的线性存储结构,因此栈的具体实现有以下两种方式:
顺序栈:采用顺序存储结构可以模拟栈存储数据的特点,从而实现栈存储结构;
链栈:采用链式存储结构实现栈结构;
栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求:
栈只能从表的一端存取数据,另一端是封闭的;
在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。
通常,栈的开口端被称为栈顶;相应地,封口端被称为栈底。因此,栈顶元素指的就是距离栈顶最近的元素。
Ⅷ 栈的顺序存储是什么
由于栈是运算受限的线性表,因此线性表的存储结构对栈也适用,而线性表有顺序存储和链式存储两种,所以栈也有顺序存储和链式存储两种。
1.栈的顺序存储栈的顺序存储是利用一组地址连续的存储单元依次存放从栈底到栈顶的数据元素,并附设指针top指示栈顶。
2.栈的顺序存储类型定义1)用内存动态分配方式定义栈的顺序存储(1)栈的顺序存储表示。
顺序栈本质上是顺序表的简化,由于栈底位置是固定不变的,所以可以将栈底位置设置在存储空间的基地址上,栈顶位置是随着进栈和退栈操作而变化的,故用top来指示当前栈顶元素的下一个位置,通常称top为栈顶指针。
Ⅸ 栈只能顺序存储,这句话对吗,为什么
栈只能顺序存储,这句话不对。栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom)。
一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈也称为后进先出表。线性表可以顺序存储,也可以链式存储,因此栈也可以采用链式存储结构。
(9)用栈存储信息扩展阅读:
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。
栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:
1、函数的返回地址和参数。
2、临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
链式存储结构的特点:
1、比顺序存储结构的存储密度小(链式存储结构中每个结点都由数据域与指针域两部分组成,相比顺序存储结构增加了存储空间)。
2、逻辑上相邻的节点物理上不必相邻。
3、插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
4、查找节点时链式存储要比顺序存储慢。
5、每个节点是由数据域和指针域组成。
6、由于簇是随机分配的,这也使数据删除后覆盖几率降低,恢复可能提高。
顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。
采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。
参考资料:网络-栈
参考资料:网络-链式存储结构
参考资料:网络-顺序存储结构