堆栈

35.python用链表实现堆栈

心不动则不痛 提交于 2020-01-28 12:43:49
class Node : def __init__ ( self ) : self . next = None self . data = 0 top = None def isempty ( ) : if top == None : return 1 else : return 0 def push ( data ) : global top new_node = Node ( ) new_node . next = top new_node . data = data top = new_node def pop ( ) : global top if isempty ( ) == 1 : print ( "堆栈已空" ) return - 1 temp = top . data top = top . next return temp while True : i = int ( input ( '输入-1停止,输入1压栈,输入0出栈' ) ) if i == - 1 : break elif i == 1 : data = int ( input ( '输入' ) ) push ( data ) else : pop ( ) print ( '============================================' ) while ( not

堆栈和托管堆以及装箱和拆箱的理解

一个人想着一个人 提交于 2020-01-28 07:16:56
C#中的类型都来源于system.object类型,分为值类型和引用类型,分别存在内存的堆栈和托管堆中,值类型一般都是简单类型如int float double等,他们保存在堆栈中,是按后进先出(LIFO)原则存储数据项的一种数据结构。在计算机系统中,栈特指处理器支持的一块内存区域,其中保存着局部变量。工作方式是先分配内存的变量后释放(先进后出原则),所以一旦出了作用域就会被释放,所以在整个项目中无法使用,这个时候就想到了托管堆。 堆(托管堆)存储引用类型。此堆非彼堆,.NET中的堆由垃圾收集器自动管理。与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。现在来举个例子看看在内存中是如何通过堆栈和托管堆保存数据的。 Int a=100; 那么在堆堆栈中就会分出一块空间用来保存a,值为100,现在有一个方法 Int GetNum(int b) { b=500; Return b; } 这个时候把a的值作为参数传给这个方法,那么此时a的值会不会变成500呢,这个就是我们重点讨论的问题,方式就是一个临时的,用完就会被释放,其实我们只是复制了一个a的到方法里了,所有a的值不会改变 Student stu=new Student(); 我们知道上面的是一个引用类型的变量,它在内部的进程是 首先在堆栈中分出一块空间用来放Student stu的引用,然后将new Student(

三、常用的汇编指令

﹥>﹥吖頭↗ 提交于 2020-01-27 20:42:16
常用的汇编指令: push :把一个32位的操作数压入堆栈中。这个操作导致esp被减4.esp被形象地称为栈顶。我们认为顶部地址是地址小的区域,那么, 压入堆栈的数据越多,这个堆栈也就越堆越高,esp也就越来越小。在32位平台上,esp每次减少4(字节)。 pop :相反,esp被加4,一个数据出栈。pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。 一般不会把sub、add这样的算术指令,以及call、ret这样的跳转指令归入堆栈相关指令中。但实际上在函数参数传递过程中,sub和add最常用来操作 堆栈;call和ret对堆栈也有影响。所以这里作为特殊处理。 sub :减法。格式为:sub 被减数,减数 add :加法。格式与sub类似。 ret :返回。实际返回地址是当前call对应的下一行代码,这个返回的地址一般会在call执行时被压入堆栈。 call:调用函数。 1 call的本质相当于push+jmp ret的本质相当于pop+jmp 如果需要在堆栈中分配4个4字节长整型的空间,则用esp减去4*4=16即可。 同时,也可以用add来恢复。常用于分配函数局部变量空间。 mov 数据移动指令,或者说数据复制命令。 用法是 mov 移到哪(到哪去),移动谁(从哪来) xor 异或指令,通常用于代替mov eax,0 lea指令 lea edi,[ebp-0cch]

程序的内存布局

帅比萌擦擦* 提交于 2020-01-27 05:33:02
程序文件的一般布局(注意:此处是程序文件exe的布局,不是内存布局): 代码在可执行程序中的对应关系(注意:没有堆栈段): 程序的内存布局: 文件布局在内存中映射(有堆栈段): 各个段的作用: 1.堆栈段在程序运行后才正式存在,是程序运行的基础;(注意:所以堆栈段在程序文件的布局中没有,在内存布局中有) 2…bss段存放的是未初始化的全局变量和静态变量; 3…text段存放的是程序中执行代码; 4…data段保存的是那些已经初始化了的全局变量和静态变量; 5…rodata段存放程序中的常量值,如字符串常量; 程序术语对应关系: 静态存储区通常指程序中的.bss和.data段; 只读区通常指程序中的.rodata段; 局部变量所占空间为栈上空间; 动态空间为堆中的空间; 程序可执行代码存放于.text段; 来源: CSDN 作者: 大坏蛋的小可爱 链接: https://blog.csdn.net/QQ1402369668/article/details/103796572

常用汇编指令复习

天涯浪子 提交于 2020-01-27 04:43:10
从事 Windows 底层的开发,一定要懂得一定的汇编的语言。其实 Windows 的底层都是使用 C 语言代码编译而成的机器码,再被调试器反汇编成汇编语言代码。对于机器码我们肯定不好理解,这时候汇编语言就成了一个很好的中间媒介。 堆栈相关的常用指令 PUSH: 把一个 32 位的操作数压入堆栈中,这个操作导致 esp 减 4( 我们认为堆栈顶部是地址小的区域 ) ,操作数成为栈顶。 POP: 与 PUSH 指令相反,这个指令是取出栈顶的操作数,导致 esp 加 4 。 SUB: 减法指令,第一个参数是被减数所在的寄存器,第二个参数是减数所在的存储器 ADD: 加法指令,原理同上 RET: 返回指令,相当于跳转回调用函数的地方。 CALL: 调用函数 数据传送指令 MOV: 数据移动,这是最简单的数据传输指令,第一个参数书移动数据的目的地,第二个参数是数据的来源 XOR: 异或,这个本来是一个逻辑运算符,但是 XOR eax , eax 这样的指令常常用来代替 MOV eax , 0 ,好处是速度更快,占用字节更少。 LEA: 取得 ( 后面的操作数 ) 地址后放入前面的存储器中。 STOS: 串存储指令。为了解释这个指令,需要借助一段代码 : Mov ecx, 30h Mov eax,0ccccccch Rep stos dword pt res:[edi]

堆栈

帅比萌擦擦* 提交于 2020-01-26 17:16:42
堆栈的链式存储实现: 直接上代码: 栈类: //仅仅是为了复习用,为了省时间,我把判断是否出界等功能省了 public class Stack { int Len ; Node head ; public Stack ( ) { this . head = null ; this . Len = 0 ; } public void Push ( int data ) { Node node = new Node ( data ) ; Node flag = null ; flag = this . head ; this . head = node ; node = flag ; this . head . next = node ; this . Len ++ ; } //压栈操作 public void Pull ( ) { System . out . println ( this . head . data + "出栈" ) ; this . head = this . head . next ; this . Len -- ; } //出栈操作 public void Print ( ) { Node a ; a = this . head ; for ( int i = this . Len ; i > 0 ; i -- ) { System . out .

汇编语言常用指令

纵然是瞬间 提交于 2020-01-26 09:18:17
1、堆栈相关指令 push:把一个32位的操作数压入堆栈中。这个操作导致esp被减4。esp被形象地称为栈顶。我们认为顶部是地址小的区域,那么,压入堆栈的数据越多,这个堆栈也就越堆越高,esp也就越来越小。在32位平台上,esp每次减少4(字节)。 pop:相反,esp被加4,一个数据出栈。pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。 sub:减法。第一个参数是被减数所在的寄存器;第二个参数是减数。(对应的还有add指令。) add:加法。 ret:返回。相当于跳转回调用函数的地方。(对应的call指令来调用函数,返回到call之后的下一条指令。)(本质相当于pop+jmp) call:调用函数。(本质相当于push+jmp) 2、数据传送指令 mov:数据移动。第一个参数是目的,第二个参数是来源。在C语言中相当于赋值号。 xor:异或。这虽然是逻辑运算的指令,但是有趣的是,xor eax,eax这样的操作常常用来代替mov eax,0。好处是速度更快,占用字节数更少。(见到xor eax,eax,应该马上明白这是清零操作。) lea:取得地址(第二个参数)后放入到前面的寄存器(第一个参数)中。(mov不支持后一个操作数写成寄存器减去数字,但是lea支持,所以可以用lea来代替它。) stos:看如下例子 mov ecx,30h mov eax

线程堆栈(Thread Stack)和托管堆(Managed Heap)

孤人 提交于 2020-01-26 04:35:06
内存格局 通常分为四个区 全局数据区:存放全局变量,静态数据,常量 代码区:存放所有的程序代码 栈区:存放为运行而分配的局部变量,参数,返回数据,返回地址等, 堆区:即自由存储区 值类型变量与引用类型变量 的内存分配模型也不一样。为了理解清楚这个问题,首先必须区分两种不同类型的内存区域: 线程堆栈(Thread Stack)和托管堆(Managed Heap)。 每个正在运行的程序都对应着一个进程(process),在一个进程内部,可以有一个或多个线程(thread),每个线程都拥有一块“自留地”,称为“线程堆栈”,大小为1M,用于保存自身的一些数据,比如函数中定义的局部变量、函数调用时传送的参数值等,这部分内存区域的分配与回收不需要程序员干涉。所有值类型的变量都是在线程堆栈中分配的。 另一块内存区域称为“堆(heap)”,在.NET 这种托管环境下,堆由CLR 进行管理,所以又称为“托管堆(managed heap)”。用new 关键字创建的类的对象时,分配给对象的内存单元就位于托管堆中。 在程序中我们可以随意地使用new 关键字创建多个对象,因此,托管堆中的内存资源是可以动态申请并使用的,当然用完了必须归还。 打个比方更易理解:托管堆相当于一个旅馆,其中的房间相当于托管堆中所拥有的内存单元。当程序员用new 方法创建对象时,相当于游客向旅馆预订房间

内联函数

笑着哭i 提交于 2020-01-26 02:57:53
内敛函数虽然叫作函数,在定义和声明(内敛函数声明处就应该也是定义处)的语法上也和普通函数一样,但它已经失去了函数的本质(真正的函数被调用时会在主调函数的函数栈中压栈被调函数的堆栈帧(实参、位于主调函数中的返回地址、主调函数堆栈帧的EBP寄存器指针、被调函数的局部变量、其他寄存器)参见 《浅谈C/C++堆栈指引——C/C++堆栈很强大》 )。函数是一段可以重复使用的代码,它位于虚拟地址空间中的代码区,也占用可执行文件的体积,而内敛函数的代码在编译后就被消除了,不存在与虚拟地址空间中,没法重复使用。 来源: CSDN 作者: HayPinF 链接: https://blog.csdn.net/HayPinF/article/details/103794152

Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现

穿精又带淫゛_ 提交于 2020-01-25 09:34:51
1、堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作。 堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈。 Java中已经出了Stack的具体实现类 堆栈的数据集合可以表示为a0,a1,…,an-1,每个数据元素的数据类型可以是任意的类类型。 操作集合  (1)入栈push(obj):把数据元素obj插入堆栈。  (2)出栈pop():出栈, 删除的数据元素由函数返回。  (3)取栈顶数据元素getTop():取堆栈当前栈顶的数据元素并由函数返回。 (4)非空否notEmpty():若堆栈非空则函数返回true,否则函数返回false。 堆栈是各种软件系统中应用最广泛的数据结构之一。括号匹配和表达式计算是编译软件中的基本问题,其软件设计中都需要使用堆栈。 首先来看应用之一: 中缀表达式转为后缀表达式 1、前缀表达式(Prefix Notation)是指将运算符写在前面操作数写在后面的不包含括号的表达式,而且为了纪念其发明者波兰数学家Jan Lukasiewicz所以前缀表达式也 叫做“波兰表达式”。比如- 1 + 2 3 2、后缀表达式