堆栈

C++堆栈应用(一):数制转换

让人想犯罪 __ 提交于 2020-02-06 07:01:50
十进制N和其它进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理: N=(n div d)*d+n mod d ( 其中:div为整除运算,mod为求余运算) 例如 (1348)10=(2504)8,其运算过程如下: 不难发现,最后得到的余数2在新的八进制数的最高位(第一位),而最先得到的余数4在新的八进制数的最低位(最后一位)。而我们一般读数是从最高位读起,所以比较简便的做法是将每次取余(mod)得到的余数存储在具有后进先出的特点的结构中,这样只需依次读出余数,便得到了相应的新数制的数。而堆栈刚好具有这样的特点。 使用堆栈进行数制转换的算法如下: void Conversion ( int n , int base ) { LinkStack * s ; s = InitStack ( ) ; int remainder ; while ( n != 0 ) { //进行求模运算,直到n为0时退出循环 remainder = n % base ; Push ( s , remainder ) ; n = n / base ; } while ( s - > next != NULL ) //依次弹出栈顶的元素,最终形成的数即为所求进制数 cout << Pop ( s ) ; cout << endl ; } 1.使用链栈实现数制转换的完整程序

获取函数调用堆栈

大憨熊 提交于 2020-02-06 05:18:41
int backtrace(void **buffer,int size) 该函数用于获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指定buffer中可以保存多少个void* 元素。函数返回值是实际获取的指针个数,最大不超过size大小。 在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈框架有一个返回地址。 注意:某些编译器的优化选项对获取正确的调用堆栈有干扰,另外内联函数没有堆栈框架;删除框架指针也会导致无法正确解析堆栈内容。 1. 代码: #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <execinfo.h> #include <signal.h> void dump(int signo) { void *buffer[30] = {0}; size_t size; char **strings = NULL; size_t i = 0; size = backtrace(buffer, 30); fprintf(stdout, "Obtained %zd stack frames.nm\n", size); strings = backtrace_symbols(buffer, size); if (strings ==

堆栈溢出技术从入门到精通

你说的曾经没有我的故事 提交于 2020-02-06 03:54:06
借鉴了很多大佬的解释,就不一 一点出来了,真的感谢!!! 1.what是堆栈? 从操作上来讲,堆栈是一个先入后出的队列。压栈的操作push=ESP-4,出栈的操作是pop=ESP+4.换句话说,堆栈中老的值,其内存地址,反而比新的值要大。这是堆栈溢出的基本理论依据。 在一次函数调用中,堆栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量,接下来,就在堆栈中开辟相应的空间以构造变量。函数执行结束,这些局部变量的内容将被丢失。但是不被清除。在函数返回的时候,弹出EBP,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。 在C语言程序中,参数的压栈顺序是反向的。比如func(a,b,c)。在参数入栈的时候,是:先压c,再压b,最后a。在取参数的时候,由于栈的先入后出,先取栈顶的a,再取b,最后取c。这些是汇编语言的基础知识,用户在开始前必须要了解这些知识。 2.what是堆栈溢出? 运行时的堆栈分配 堆栈溢出就是向该数据块写入了过多的数据,导致数据越界。 # include int main ( ) { char name [ 8 ] ; printf ( "Please type your name: " ) ; gets ( name ) ; printf ( "Hello, %s!" , name ) ; return 0 ; } 编译并且执行

【1/33】调用堆栈

你说的曾经没有我的故事 提交于 2020-02-06 03:44:46
33 文章目录 调用栈 JavaScript 引擎 执行上下文 创建执行上下文 变量环境: 执行阶段 javascript事件循环 setTimeout setInterval Promise与process.nextTick(callback) 调用栈 调用栈 是解释器(就像浏览器中的JavaScript解释器)追踪函数执行流的一种机制。当执行环境中调用了多个函数函数时,通过这种机制,我们能够追踪到哪个函数正在执行,执行的函数体中又调用了哪个函数。 拥有 LIFO(后进先出)数据结构的栈,被用来存储代码运行时创建的所有执行上下文。 当 JavaScript 引擎第一次遇到你的脚本时,它会创建一个全局的执行上下文并且压入当前执行栈。每当引擎遇到一个函数调用,它会为该函数创建一个新的执行上下文并压入栈的顶部。 每调用一个函数,解释器就会把该函数添加进调用栈并开始执行。每一个进入调用栈的都称为 调用帧 。 正在调用栈中执行的函数还调用了其它函数,那么新函数也将会被添加进调用栈,一旦这个函数被调用,便会立即执行。 当前函数执行完毕后,解释器将其清出调用栈,继续执行当前执行环境下的剩余的代码。 当分配的调用栈空间被占满时,会引发 堆栈溢出 。 JavaScript 引擎 谷歌的 V8 引擎: 在这里插入代码片 这个引擎主要由两部分组成: 内存堆:这是内存分配发生的地方 调用栈

堆栈图

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-05 18:02:46
  堆栈图是个有意思的东西,这些东西都是前面博文中重点描述的指令,这里跨过函数讲解,直接看汇编代码,每一步骤都在图中标记,这里我也不知道怎么用语言去描述,,,,前面练习那么多汇编其实就是为了这个,看图识文吧,,,, 来源: https://www.cnblogs.com/Reverse-xiaoyu/p/11489082.html

堆栈图

我只是一个虾纸丫 提交于 2020-02-05 14:18:09
1.函数 计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时还带 有一入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序, 供计算机处理,所谓出口,就是指函数的计算结果,也称为返回值,在计算机求得之后,由此口带回给调用它的程序。 2.汇编中的函数 3.函数的入口 4.函数的出口 5.windows堆栈和堆栈平衡 6.堆栈图实例 来源: https://www.cnblogs.com/ShiningArmor/p/11505655.html

1051 Pop Sequence (25分)

只谈情不闲聊 提交于 2020-02-05 00:38:19
1051 Pop Sequence (25分) 给定一个最多能保存M个数的堆栈。按1,2,3,…,N的顺序推N个数字,然后随机弹出。您应该知道给定的数字序列是否可能是堆栈的弹出序列。例如,如果M是5,N是7,我们可以从堆栈中获得1,2,3,4,5,6,7,但不能从3,2,1,7,5,6,4。 输入规格: 每个输入文件包含一个测试用例。对于每一种情况,第一行包含3个数字(不超过1000个):M(堆栈的最大容量)、N(推送序列的长度)和K(要检查的POP序列的数目)。接下来是K行,每行包含N个数字的pop序列。一行中的所有数字都用空格隔开。 输出规格: 对于每个弹出序列,如果确实是堆栈的可能弹出序列,则在一行中打印“是”,如果不是,则打印“否”。 样本输入: Sample Input: 5 7 5 1 2 3 4 5 6 7 3 2 1 7 5 6 4 7 6 5 4 3 2 1 5 6 4 3 7 2 1 1 7 6 5 4 3 2 Sample Output: YES NO NO YES NO 思路:将1~n一次入栈,在入栈的过程中 如果入栈的元素加好等于出栈序列当前等待出栈的元素,那么就让栈元素出栈,同时把出栈序列当前等待出栈的元素位置标记后移1位; 注:1,栈的大小有限 2.对栈操作前要判空 3.使用栈之前要清空栈 #include <stdio.h> #include

括号匹配问题

不羁岁月 提交于 2020-02-04 22:13:12
括号匹配问题 堆栈存入数组下标间接实现数组元素的操作 不使用堆栈 # include <iostream> # include <string> using namespace std ; bool find ( string & s , int index ) { while ( index > 0 ) { index -- ; if ( s [ index ] == '(' ) { s [ index ] = 'a' ; return true ; } } return false ; } int main ( ) { string data ; while ( cin >> data ) { cout << data << endl ; for ( int i = 0 ; i < data . length ( ) ; i ++ ) { if ( data [ i ] == ')' ) { if ( find ( data , i ) ) { data [ i ] = 'a' ; } } } for ( int i = 0 ; i < data . length ( ) ; i ++ ) { if ( data [ i ] == '(' ) { cout << "$" ; } else if ( data [ i ] == ')' ) { cout << "?" ; }

JS 堆栈内存底层机制

心已入冬 提交于 2020-02-04 07:10:43
JS的生存环境在浏览器中,浏览器执行JS代码需要: 1.从电脑内存中分配出一块内存,用来执行代码,这就是栈内存。 2.分配一个主线程用来自上而下执行JS代码(JS实际上是单线程运行) 下面画一张图说明下堆栈底层操作: 来源: CSDN 作者: -小龙人 链接: https://blog.csdn.net/qq_36330228/article/details/104112692

AJ整理问题之:内存堆栈

谁说胖子不能爱 提交于 2020-02-04 05:47:49
内存 数据在内存中的存放 在计算机中,运行的应用程序的数据都是保存在内存中的。 不同类型的数据,保存的内存区域不同,其中包括: 1:栈区(stack)由编译器自动分配并释放,一半存放函数的参数值,局部变量等。 2:堆区(heap)由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收。 3:全局区(静态区)全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。 上面三个很重要,下面三个了解 4:文字常量区:存放常亮字符串,程序结束后由系统释放。 5:程序代码区:存放函数的二进制代码。 6:寄存器去:用来保存栈顶指针和指令指针(我们基本用不到。。。)。 栈内存区中得数据 栈区内存是压栈的讲究 特点:先进后出。 系统给自动回收。 由系统自动分配,速度较快。但程序员是无法控制的。 int sum(int x, int y) { NSLog(@"x: %p, Y: %p", &x, &y); int result = x + y; NSLog(@"%p", &result); return result; } void demo1() { // 在栈区中的变量,i本质上对应"内存地址"的"标签" // 指针 * 表示指向内容空间的内容 & 表示地址 int i = 10; i =