【Stack】C++ stack的基本使用方法与经典例题

栈的定义

栈是一个后进先出表(LIFO,last in first out)

可以想象成一个弹夹

可以用数组手动实现,但这里主要介绍用STL的实现方式

C++ STL stack的基本使用方法

#include <stack> //头文件
stack<int> mystack; //声明
mystack.push(x); //压栈
mystack.pop(); //弹栈
mystack.top(); //访问栈顶元素
mystack.size(); //访问栈元素个数
mystack.empty(); //判断栈是否为空

C++ STL stack的使用注意事项

1.pop函数没有返回值,只会弹栈

2.top和pop函数在栈为空时是非法的

3.栈不能随机访问元素

经典例题

1.程序员输入问题

题目描述

程序员输入程序出现差错时,可以采取以下的补救措施:
1.按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;
2.发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。

分析

1.退格:直接pop

2.退行:手动清空栈

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, x;
string s;
stack<char> sk, ans;
signed 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第1章 PE文件格式深入研究<br/><br/>1.1 PE文件格式格式纵览<br/><br/> 1.1.1 区块(Section)<br/><br/> 1.1.2 相对虚拟地址(Relative Virtual Addresses)<br/><br/> 1.1.3 数据目录<br/><br/> 1.1.4 输入函数(Importing Functions)<br/><br/>1.2 PE文件结构<br/><br/> 1.2.1 The MS-DOS头部<br/><br/> 1.2.2 IMAGE_NT_HEADERS头部<br/><br/> 1.2.3 区块表(The Section Table)<br/><br/> 1.2.4 各种块(Sections)的描述<br/><br/> 1.2.5 输出表<br/><br/> 1.2.6 输出转向(Export Forwarding)<br/><br/> 1.2.7 输入表<br/><br/> 1.2.8 绑定输入(Bound import)<br/><br/> 1.2.9 延迟装入数据(Delayload Data)<br/><br/> 1.2.10 资源<br/><br/> 1.2.11 基址重定位(Base Relocations)<br/><br/> 1.2.12 调试目录(DebugDirectory)<br/><br/> 1.2.13 NET头部<br/><br/> 1.2.14 TLS初始化<br/><br/> 1.2.15 程序异常数据<br/><br/> <br/><br/>第2章 PE分析工具编写<br/><br/>2.1 文件格式检查<br/><br/>2.2 FileHeader和OptionalHeader内容的读取<br/><br/>2.3 得到数据目录(Data Dircetory)信息<br/><br/>2.4 得到块表(SectionTable)信息<br/><br/>2.5 得到输出表(ExportTable)信息<br/><br/>2.6 得到输入表(ImportTable)信息<br/><br/> <br/><br/>第3章 Win32 调试API<br/><br/>3.1 Win32调试API原理<br/><br/> 3.1.1 调试相关函数简要说明<br/><br/> 3.1.2 调试事件<br/><br/> 3.1.3 如何在调试时创建并跟踪一个进程<br/><br/> 3.1.4 最主要的循环体<br/><br/> 3.1.5 如何处理调试事件<br/><br/> 3.1.6 线程环境详解<br/><br/> 3.1.7 如何在另一个进程中注入代码<br/><br/>3.2 利用调试API编写脱壳机<br/><br/> 3.2.1 tElock 0.98脱壳简介<br/><br/> 3.2.2 脱壳机的编写<br/><br/>3.3 利用调试API制作内存补丁<br/><br/> 3.3.1 跨进程内存存取机制<br/><br/> 3.3.2 Debug API机制<br/><br/> <br/><br/>第4章 Windows下的异常处理<br/><br/>4.1 基本概念<br/><br/> 4.1.1 Windows下的软件异常<br/><br/> 4.1.2 未公开的可靠吗<br/><br/>4.2 结构化异常处理(SEH)<br/><br/> 4.2.1 异常处理的基本过程<br/><br/> 4.2.2 SEH的分类<br/><br/> 4.2.3 相关API<br/><br/> 4.2.4 SEH相关数据结构<br/><br/>4.3 异常处理程序设计<br/><br/> 4.3.1 顶层(top-level)异常处理<br/><br/> 4.3.2 线程异常处理<br/><br/> 4.3.3 异常处理的堆栈展开(Stack unwind)<br/><br/> 4.3.4 异常处理程序设计中的几个注意事项:<br/><br/>4.4 SEH的简单应用<br/><br/> 4.4.1 Win9x下利用SEH进ring0<br/><br/> 4.4.2 利用SEH实现对自身的单步自跟踪<br/><br/> 4.4.3 其它应用<br/><br/>4.5 系统背后的秘密<br/><br/>4.6 VC是如何封装系统提供的SEH机制的<br/><br/> 4.6.1 扩展的EXCEPTION_REGISTRATION级相关结构<br/><br/> 4.6.2 数据结构组织<br/><br/>4.7 Windows XP下的向量化异常处理(VEH)<br/><br/> <br/><br/> <br/><br/>第5章 软件加密技术<br/><br/>5.1 反调试技术(Anti-Debug)<br/><br/> 5.1.1 句柄检测<br/><br/> 5.1.2 SoftICE后门指令<br/><br/> 5.1.3 int68子类型<br/><br/> 5.1.4 ICECream子类型<br/><br/> 5.1.5 判断NTICE服务是否运行<br/><br/> 5.1.6 INT 1 检测<br/><br/> 5.1.7 利用UnhandledExceptionFilter检测<br/><br/> 5.1.8 INT 41子类型<br/><br/>5.2 反跟踪技术(Anti-Trace)<br/><br/> 5.2.1 断点检测<br/><br/> 5.2.2 利用SEH反跟踪<br/><br/> 5.2.3 SMC技术实现<br/><br/>5.3 反加载技术(Anti-Loader)<br/><br/> 5.3.1 利用TEB检测<br/><br/> 5.3.2 利用IsDebuggerPresent函数检测<br/><br/> 5.3.3 检查父进程<br/><br/>5.4 反DUMP技术(Anti-Dump)<br/><br/>5.5 文件完整性检验<br/><br/> 5.5.1 CRC校验实现<br/><br/> 5.5.2 校验和(Checksum)<br/><br/> 5.5.3 内存映像校验<br/><br/>5.6 反监视技术(Anti-Monitor)<br/><br/> 5.6.1 窗口方法检测<br/><br/> 5.6.2 句柄检测<br/><br/>5.7 反静态分析技术<br/><br/> 5.7.1 扰乱汇编代码<br/><br/> 5.7.2 花指令<br/><br/> 5.7.3 信息隐藏<br/><br/>5.8 代码与数据结合技术<br/><br/>5.9 软件保护的若干忠告<br/><br/> <br/><br/>第6章 加壳软件编写<br/><br/>6.1 外壳编写基础<br/><br/> 6.1.1 判断文件是否是PE格式的EXE文件<br/><br/> 6.1.2 文件基本数据的读入<br/><br/> 6.1.3 额外数据保留<br/><br/> 6.1.4 重定位数据的去除<br/><br/> 6.1.5 文件的压缩<br/><br/> 6.1.6 资源区块的处理<br/><br/> 6.1.7 区块的融合<br/><br/> 6.1.8 输入表的处理<br/><br/> 6.1.9 外壳部分的编写<br/><br/> 6.1.10 将外壳部分添加至原程序<br/><br/> 6.1.10 小结<br/><br/>6.2 加壳程序综合运用的实例<br/><br/> 6.2.1 程序简介<br/><br/> 6.2.2 加壳子程序(WJQ_ShellBegin())<br/><br/> 6.2.3 PE外壳程序<br/><br/> 6.2.4 加进Anti技术<br/><br/> 6.2.5 通过外壳修改被加壳PE<br/><br/> 6.2.6 VC++调用汇编子程序<br/><br/> <br/><br/>第7章 如何让壳与程序融为一体<br/><br/>7.1 序<br/><br/> 7.1.1 为何需要壳和程序一体化<br/><br/> 7.1.2 为阅读此章节需要的知识<br/><br/> 7.1.3 基于此章节用的的例子程序说明<br/><br/>7.2 欺骗检查壳的工具<br/><br/> 7.2.1 fi是如何检查壳的<br/><br/> 7.2.2 欺骗fi<br/><br/>7.3 判断自己是否给脱壳了<br/><br/> 7.3.1 判断文件尺寸<br/><br/> 7.3.2 检查标记<br/><br/> 7.3.3 外部检测(使用dll)<br/><br/> 7.3.4 hook 相关的api(防止loader和调试api)<br/><br/>7.4 使用sdk把程序和壳溶为一体<br/><br/> 7.4.1 sdk的意义<br/><br/> 7.4.2 做一个带sdk的壳<br/><br/>7.5 后记:关于壳和程序的思考<br/><br/> <br/><br/> <br/><br/>第8章 Visual Basic 6 逆向工程<br/><br/>8.1 简介<br/><br/>8.2 P-code传奇<br/><br/>8.3 VB编译奥秘<br/><br/>8.4 VB与COM<br/><br/>8.5 VB可执行程序结构研究<br/><br/>8.6 VB程序事件解读<br/><br/>8.7 VB程序图形界面(GUI)解读 <br/><br/>8.8 VB程序执行代码研究<br/><br/>8.9 我们的工具<br/><br/>8.10 VB程序保护篇<br/><br/> <br/><br/>附录A 在Visual C++使用内联汇编<br/><br/>附录B 在Visual Basic中使用汇编<br/>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值