当前位置:首页 » 操作系统 » 堆栈算法

堆栈算法

发布时间: 2024-10-17 22:40:47

Ⅰ 堆栈相关算法的实验验证 [实验目的] 验证顺序存储的堆栈及其上的基本操作。(c++)

目录

堆栈是什么?

实现方式

静态数组堆栈

动态数组堆栈

链式堆栈

总结

我一直在想一个问题,我怎么能把一件事情说的明白呢?尤其是程序方面的知识点。思路清楚是非常重要的(只有思路清楚,表达清楚了,才能一目了然),这个清楚的思路怎么表现出来?我努力去做这件事情。这篇主要围绕堆栈来展开话题。

Ⅱ 什么事堆栈,堆栈有哪些运算,堆栈怎样存储

stack,其实就是一块内存空间,关键在于他的用途.
1.对于程序指令来说
执行exe时,程序都会默认分配1M堆栈空间,vs2008等开发软件都可以进行调整实际大小.
指令变成一条条机器码,cpu会一条条执行.
例子:
xxxxxxx
call 0x403650 <- --
yyyyy
在执行call命令时,cpu会把下一条指令地址写入堆栈地址空间中,当然也包括其他信息.
0x403650相当于一个子程序的地址,完事后,必然有一个ret之类的指令.这时,cpu根据先前保存的地址,也就是yyyyy这条指令所对应的地址.这样就能继续往下执行了.
关于这一点,用ollydbg好好玩一下,马上就清楚了.

2.一般的应用程序编写.
我们在编写程序时,有时采用堆栈结构,有时采用队列结构,这跟所采用的算法有很大关系.
最常见的递归算法,按递归展开的话,所有的细节就跟第1点完全一样,好处是,大都程序员根本不关心象第1点所描述的细节.只知道其调用过程和最终执行结果.具体细节可能就不关心了.

当把递归算法 用非递归算法写时,很可能你就要引入堆栈结构(其实就是人为手动申请一个内存空间,比如buffer[递归最深层数], 这样,就可以编写出直观的顺序结构的代码. cpu也不用着因调用子程序,一次次把相关信息写入系统的堆栈中(第1点所说)..因为buffer[]的存在就是为了避免这种情况.

--------------------
stack最常用两种操作,push和pop. 你可以用c或是c++ 标准库提供的实现.
如果不是大工程,基本上没必要这么做.
搞个数组 buf[], 再搞个索引变量int index,用来指示top位置. 写入数据时,index++,取出数据时index--

3.最常用的,但易忽略的.
平常所说的,局部变量就是在堆栈中分配的.所以他出了作用域就自动释放了.
c语言很容易理解,不容易出错.
但c++中,编译器有不同的策略.
比如
CTeacher t= bar();
--
CTeacher bar()
{
CTeacher xx;
为CTeacher的成员赋值
return xx.
}
你一定为这里xx对象是局部变量,出了函数作用域,对应的内存主释放了.
CTeacher t= bar();
因为bar()是返回一个Cteacher对象,所以这里就要执行拷贝构造函数,
你会奇怪,问题是bar()返回的对象是无效的.但执行却不会出错.
为什么?
首先对堆栈的理解是对.只是c++编译器内部会改写bar()这个函数.
变成 void bar(CTeacher& tmp)
这样,t就作为引用参数传入了,函数内部创建临时对象,然后赋值给引用对象就成了.结果当然正确了.

4. 是第2点的延伸,相当重要.
一些大的应用工程,往往配合堆来对内存进行管理.
以后你接触一些第三方程序,一定会奇怪,要动态申请内存,直接new或malloc一个对象不就行了么,为什么要这么麻烦.
其中一个重要原因:减少碎片,提高内存使用效率.
你先申请大的空间(new/malloc),然后借助stack的特性来管理和控制这块空间!!!
-------------------------------

ps:理解到这几层差不多够用了

Ⅲ 堆栈是什么意思

问题一:什么叫做堆栈? 堆和栈是两个不同的概念。 堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(Memory Leak)”。这样会造成系统的可分配内存的越来越少,导致系统崩溃。 堆栈是一种执行“后进先出”算法的数据结构。 设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。 堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入――push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。 而堆栈寄存器就是存放堆栈的寄存器。

问题二:什么叫堆栈 堆栈是内存区开辟出来为函数中定义的变量(除了new以外的定义)提供存储空间的区域。
顾名思义,数据在堆栈中 的存储就是一个一个堆上去的,就是说后放的变量存在最上面(栈顶),所以从堆栈中取出变量时它最先被取出,(后进先出)。

问题三:堆栈的意思和作用 堆栈就是一个特殊内存区域,
用来存放数据
可以用指令PUSH ,POP 操作
主要是用来存放临时数据,比如局部变量,某个函数过程中定义的变量
堆栈是先进后出方式
比如说有个过程求和
int fun(int a,int b)
{
return a+b;
}
void main()
{
int z;
z=fun(5,6)
printf(%d,z)
}
调用fun过程时操作系统会使用堆栈来传递参数,
首先PUSH 5
PUSH 6
CALL FUN
又或者在调用过程前将各个寄存器先保存起来因为数量有限在本过程中可能用到同样的寄存器被覆盖原来的值
main
mov ax,6
mov bx,7
call proc
...
proc1 proc
push ax ;先入
push bx
子过程程序中用到AX,BX
pop bx
pop ax ;后出
ret
proc1 endp

问题四:什么是堆栈及堆栈的作用是什么 堆栈是小说中常用的人物塑造方法,通常是为一个小人物所用。举个例子,某剑客非常之吊,被称为天下无敌。可是,一个小人物在与他正面的斗争中,不用任何手段就击败了他,表现出他惊人的实力。这就是对这个小人物的堆栈,为的就是把他通过别人巨大实力的转换成这个人物的威望。这就是堆栈

问题五:堆栈向下增长是什么意思? 堆和栈是两个概念,堆向上增长,栈向下增长。
向下增长的意思是:从栈申请的内存地址会越来越小,
而从堆申请的内存地址会越来越大。

问题六:谁给详细解释一下plc的堆栈是什么意思,是在理解不了 PLC中CPU进行运算过程中,在需要进堆栈的时候才进堆栈。
比如:
1、不需要进堆栈的
LD X0
AND X1
OUT Y0.
这样的不需要进堆栈,因为每次运算的结果都存在CPU累加器A里面。(书上讲的)
2、需要进堆栈的,这段指令在执行过程中,就有数据进堆栈。(分号后加注释)
LD X0 ;取了X0的状态放进累加器
OR X1;把X1的状态与累加器内状态进行 或 运算。
LD X2;这时候如果直接取X2的状态进累加器,那前面两条指令的就白干了。
所有这条指令有隐 含操作,那就是把前面两条指令运算的结果,进行进堆栈保护,
然后再把X2的状态取进累加器。
OR X3;接着,取X3的状态与累加器或 运算
ANB ;这条执行是,就是将堆栈最上面的状态值(也就是前面进堆栈被保护的)
与当前累加器的状态进行与运算。这也就是书上说的,块 与指令。
OUT Y0;输出。
从上面分析我总结了,只要是出现LD,必须要有输出。没输出,再有LD,那必定有进堆栈操作。
这个进堆栈是PLC系统自己完成。只要你编程正确,也没必要理会他。

问题七:堆栈和栈有什么区别? 堆和栈是两个不同的概念,堆是动态内存,malloc,new等操阀在堆里面分配空间;栈里面放函数调用参数,局部变量。
对专业人士而言,一般习惯把堆和栈分开来讲。有些地方也把栈笼统地叫做堆栈,也就是说你这里说的堆栈就是指栈。你只要搞清楚堆和栈的区别就可以了。

问题八:堆栈是什么意思?如果堆栈的入栈系列是a,b,c,d,e,则输出序列是什么?并解释一下! 堆栈是一种“后进先出”的数据结构。出栈序列“e,d,c,b,a。后进入的先出来。

问题九:栈是什么意思? 栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。 栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO--Last IN First Out表龚。 栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
上面已经说得很清楚了
虽然是复制的

热点内容
编程脑子疼 发布:2024-11-24 02:31:23 浏览:169
c语言状态机 发布:2024-11-24 02:26:56 浏览:281
用友加密狗破解 发布:2024-11-24 02:23:16 浏览:707
鸿蒙系统如何变回安卓桌面 发布:2024-11-24 02:18:26 浏览:412
c语言填充 发布:2024-11-24 02:10:48 浏览:822
命名空间存储 发布:2024-11-24 02:10:45 浏览:472
java重载与重写 发布:2024-11-24 01:59:05 浏览:699
通缉令2ftp 发布:2024-11-24 01:59:04 浏览:295
android赛车游戏 发布:2024-11-24 01:58:18 浏览:105
女神联盟账号密码哪里找 发布:2024-11-24 01:58:12 浏览:479