堆栈

pta 习题集5-6 堆栈操作合法性

一世执手 提交于 2020-02-29 15:13:36
假设以 S 和 X 分别表示入栈和出栈操作。如果根据一个仅由 S 和 X 构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入 S 和 X 序列,判断该序列是否合法。 输入格式: 输入第一行给出两个正整数N和M,其中N是待测序列的个数,M( ≤50 ≤ 5 0 )是堆栈的最大容量。随后N行,每行中给出一个仅由 S 和 X 构成的序列。序列保证不为空,且长度不超过100。 输出格式: 对每个序列,在一行中输出 YES 如果该序列是合法的堆栈操作序列,或 NO 如果不是。 输入样例: 4 10 SSSXXSXXSX SSSXXSXXS SSSSSSSSSSXSSXXXXXXXXXXX SSSXXSXXX 输出样例: YES NO NO NO #include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string> #include <map> using namespace std; int n,m; char a[105]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) {

7-1 堆栈操作合法性 (20 分)

瘦欲@ 提交于 2020-02-29 15:13:11
7-1 堆栈操作合法性 (20 分) 假设以 S 和 X 分别表示入栈和出栈操作。如果根据一个仅由 S 和 X 构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入 S 和 X 序列,判断该序列是否合法。 输入格式: 输入第一行给出两个正整数N和M,其中N是待测序列的个数,M( ≤ 5 0)是堆栈的最大容量。随后N行,每行中给出一个仅由 S 和 X 构成的序列。序列保证不为空,且长度不超过100。 输出格式: 对每个序列,在一行中输出 YES 如果该序列是合法的堆栈操作序列,或 NO 如果不是。 输入样例: 4 10 SSSXXSXXSX SSSXXSXXS SSSSSSSSSSXSSXXXXXXXXXXX SSSXXSXXX    输出样例: YES NO NO NO    #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> int main() { char Stack[100]; int N, M; scanf("%d %d", &N, &M); for(int i=0; i<N; i++){ scanf("%s", Stack); int l = 0, len = strlen(Stack)

反汇编学习

让人想犯罪 __ 提交于 2020-02-29 07:06:48
(转: http://www.kuqin.com/assemble/20071122/2492.html ) 汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)   ============================   x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.    在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:   1. 通用寄存器:   EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)      这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数.

浅析VS2010反汇编

China☆狼群 提交于 2020-02-29 07:04:36
第一篇 1. 怎样进行反汇编 在调试的环境下,我们能够很方便地通过反汇编窗体查看程序生成的反汇编信息。 例如以下图所看到的。 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(true){ for(long i=0;i<Lenth;i++){ ; } Sleep(10); } } 汇编窗体 2. 预备知识 : 函数调用大家都不陌生,调用者向被调用者传递一些參数,然后运行被调用者的代码,最后被调用者向调用者返回结果,还有大家比較熟悉的一句话。就是函数调用是在栈上发生的,那么在计算机内部究竟是怎样实现的呢? 对于程序,编译器会对其分配一段内存。在逻辑上能够分为代码段。数据段,堆,栈 代码段:保存程序文本。指令指针EIP就是指向代码段。可读可运行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可运行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长。可读可写可运行 栈(Stack):存放局部变量。函数參数,当前状态。函数调用信息等, 向地址减小的方向增长 。很很重要,可读可写可运行 如图所看到的 寄存器 EAX :累加(Accumulator

STM32 FSMC使用之外扩RAM的妙用

匆匆过客 提交于 2020-02-29 04:33:37
在 STM32 上跑UCOS_II和UCGUI时,要想让屏幕稳定不闪,显示效果多样化,而且分配给每个任务的堆栈空间足够, STM32 内部的 RAM 肯定是不足的。最好的方法就是配置 FSMC 使内部 RAM 作为堆栈使用,而外部 RAM 作为变量存储和UCOS_II的任务堆栈。现在介绍 FSMC 以及如何配置,并写出启动文件中需要修改的地方。 来源: oschina 链接: https://my.oschina.net/u/2963604/blog/1810295

《Linux内核分析》MOOC课程之从迷你Linux内核角度理解进程时间轮片调度(未完)

北城余情 提交于 2020-02-28 19:53:38
代码分析 mypcb.h mymain.c 上面这段代码主要完成了对0号进程的初始化,即pid置为0,状态state置为0(即runnable状态),进程入口及当前进程的线程的ip指向my_process,线程的sp指向当前进程的进程堆栈,由于目前只有0号进程,所以next指针指向自己形成一个单PCB链表。 上面这段代码主要是扩充循环链表,使用memcpy()复制0号进程的状态给创建的从1号到MAX_TASK_NUM-1号进程,并与0号进程一起构成一个循环PCB链表。 上面这段代码功能是从循环PCB链表的task[0]启动0号进程,是通过使用了gcc的内联汇编来实现的。接下来我们具体分析该过程: 初始堆栈状态: movl %1, %%esp push1 %1 pushl %0 ret popl %%ebp 其实这段汇编代码是不会被执行的,因为ret \n\t后eip指向了0号进程的起始地址。 上面这段代码实现每循环1千万次打印一下当前进程的pid,然后判断时钟中断是否将调度标志(my_need_sched)置为1,如果是1则将调度标志置为0,调用my_schedule(),避免消息机制,然后再打印一次当前进程的pid。 myinterrupt.c my_time_handler()实现被调用每千次且调度标志(my_need_sched)不为1时,打印“>>>my_timer

分析单片机堆栈,分享个人理解

╄→尐↘猪︶ㄣ 提交于 2020-02-28 18:15:17
看关于单片机方面的书籍的时候,总是能看到别人说的一些堆栈啊什么的操作,之前看到这个术语就直接跳过,没想到去探究单片机内部的原理。但是最近课程学习微机原理这门课,需要我们写汇编程序,汇编里面经常遇到堆栈这个东西,所以就找了个时间把堆栈给彻底的搞一下。 如果了解一点汇编编程话,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。通常用来保存CALL指令调用子程序时的返回地址,RET指令从堆栈中获取返回地址。中断指令INT调用中断程序时,将标志寄存器值、代码段寄存器CS值、指令指针寄存器IP值保存在堆栈中。 堆栈也可以用来保存其他数据。 堆栈操作由PUSH,POP两条指令来完成; 堆栈操作的操作数均为子类型(两个字节)进行操作。 程序内存可以分为几个区,栈区(stack),堆区(Heap),全局区(static),文字常亮区,程序代码区。 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 我们一般说的堆栈指的栈。堆栈又分硬堆栈和软堆栈,硬堆栈即SP,从片内RAM的顶部向下生长。软堆栈在硬堆栈跟全局变量区之间的空间,C51函数调用通过R0-R7和栈来实现。 为什么单片机启动时

堆、栈、堆栈、队列的区别

怎甘沉沦 提交于 2020-02-27 17:02:18
堆栈都是一种 数据项 按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 要点:堆:顺序随意 栈:后进先出(Last-In/First-Out) 堆 堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 ④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 栈 栈:什么是栈?又该怎么理解呢? ①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出) ③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。 堆栈 堆栈

算法题分析 出入栈问题

你。 提交于 2020-02-25 22:36:44
1. 如果一堆栈的输入序列是aAbBc,输出为 abcBA,那么该堆栈所进行的操作序列是什么? 设P代表入栈,O代表出栈。 首先第一个输入是a ,第一个输出也是a,我们把a进栈,然后再弹出去就可以了: 操作为 PO。 然后,第二个输入是A,进栈,但是不能这个时候弹出去,因为第二个输出应该是b,正好第三个输入为b, 操作为PPO。 然后第四个输入为B,第三个弹出为c,栈里没有c,故继续读取,读到c,弹出。 操作为PPO 现在栈里还有两个数:a , b 所以按顺序出栈即可:OO 最后连起来,即 POPPOPPOOO 2. 若用单向链表实现一个堆栈,当前链表状态为:1->2->3。当对该堆栈执行pop()、push(4)操作后,链表状态变成怎样? 首先注意单向链表只能用栈头结点代表栈顶,因为单向链表只能指向下一个元素,而不能指向前面的元素,故如果栈顶是链表尾,则弹栈以后无法得到新的栈顶。 所以1是栈顶。弹栈,4进栈以后,答案是 4->2->3 来源: CSDN 作者: Dezeming 链接: https://blog.csdn.net/tiao_god/article/details/104503218

✨浏览器特性

[亡魂溺海] 提交于 2020-02-24 09:28:04
js是一个单线程,非阻塞,异步脚本语言 在执行栈中先进后出 (相对与函数中调用函数,单行代码执行直接出去了) 栈里面表现很慢的东西叫阻塞 slow //比如http请求 如果我们在浏览器控制台中运行'foo'函数,是否会导致堆栈溢出错误? function foo() { setTimeout(foo, 0); // 是否存在堆栈溢出错误? }; 引言: JavaScript并发模型基于“事件循环”。 当我们说“浏览器是 JS 的家”时我真正的意思是 浏览器提供运行时环境来执行我们的JS代码 浏览器的主要组件包括 调用堆栈 , 事件循环,任务队列 和 Web API 。 像 setTimeout , setInterval 和 Promise 这样的全局函数不是JavaScript的一部分,而是 Web API 的一部分。 JavaScript 环境的可视化形式如下所示: JS调用栈是后进先出(LIFO)的。引擎每次从堆栈中取出一个函数,然后从上到下依次运行代码。每当它遇到一些异步代码,如 setTimeout ,它就把它交给 Web API (箭头1)。因此,每当事件被触发时, callback 都会被发送到任务队列(箭头2)。 事件循环(Event loop) 不断地监视任务队列(Task Queue),并按它们排队的顺序一次处理一个回调。每当 调用堆栈(call stack)