当前位置: 首页 > news >正文

剑指offer系列15:栈的压入、弹出序列

今天这道题我花了流程图,思路清晰了很多,对于自己哪方面不够熟悉也清楚了。这个题可以建立一个辅助的栈,建立一个循环,一直判断第二个序列中的元素是否在栈顶,如果在栈顶就弹出栈顶的元素并且寻找第二个序列中的下一个数字,如果发现不在栈顶就一直给栈顶添加元素直到在栈顶遇见这个数字。代码在下面,第一次知道for循环还可以这么写,这样等于嵌套了两个for循环,而且循环中递增项在循环内部。

 1 #include<iostream>
 2 #include<vector>
 3 #include<stack>
 4 using namespace std;
 5 class Solution {
 6 public:
 7     bool IsPopOrder(vector<int> pushV, vector<int> popV) {
 8         stack<int> st;
 9         int i, j = 0;
10         int len = popV.size();
11         st.push(pushV[0]);
12         for (i = 0, j = 0; i < len&&j < len; )
13         {
14             if (popV[j] == st.top() && st.empty() != true)//判断是否在栈顶
15             {
16                 st.pop();
17                 j++;
18             }
19             else {//这里要注意,因为进入循环的条件是i<len,所以i可能等于len-1,此时不能访问pushV[++i],非法
20                 if (i + 1 < len)
21                     st.push(pushV[++i]);
22                 else
23                     i++;//如果i+1=len,还没有找到,说明没有了,给i+1让循环出来
24             }
25         }
26         if (st.empty() == true)
27             return true;
28         else
29             return false;
30     }
31 };
32 int main()
33 {
34     Solution so;
35     vector<int> v1 = { 1,2,3,4,5 };
36     vector<int> v2 = { 4,5,3,2,1 };
37     vector<int> v3 = { 4,3,5,1,2 };
38     cout << so.IsPopOrder(v1, v2) << endl;
39     cout << so.IsPopOrder(v1, v3) << endl;
40     return 0;
41 }

今天总结两点:

1,思路清晰很重要,画流程图

2.一个思路进行不下去想想类似的其他表达方式,思路要灵活

今天我参考github上答案的时候,发现参考了答案之后也报错,不能一味的相信答案。答案在中间我注释的地方没有考虑到,因此死循环了。

最后,我想写一点最近关于学习的感悟。首先,学习是自己的事,因此你在学习的时候不要跟别人做比较。跟别人比容易迷失自己,只要自己清楚自己的该做什么,以什么样的进度去做就够了,多关注自己。我知道这样很难,但是我想一点一点去努力尝试做到。其次,学习的目的可以提高自己,也可以是开阔眼界,但绝对不是让别人觉得我爱学习,别虚荣,没有一点意义。再说了,你学习不学习,除了你自己,还有谁真的在乎呢?

转载于:https://www.cnblogs.com/neverland0718/p/11015159.html

相关文章:

  • go语言快速入门教程
  • 物理学界四大神兽
  • Redis数据操作
  • Vue2.0 中,“渐进式框架”和“自底向上增量开发的设计”这两个概念是什么?(转)...
  • 9、Java语句
  • [转载]SQL Server查找包含某关键字的存储过程3种方法
  • Android 项目优化(二):启动页面优化
  • 微信小程序常用样式汇总
  • 虚拟机导入虚拟电脑 环境变量丢失
  • mysql优化:覆盖索引(延迟关联)
  • 编译原理--02 自顶向下、自底向上的LR分析复习(清华大学出版社第3版)
  • webservice服务器借用cxf工具开发
  • 软件测试2019:第八次作业—— 缺陷管理(含缺陷管理工具的配置实验)
  • 实验6 流类库与I/O
  • Python day 44 :数据库的存储引擎/索引/权限管理
  • ----------
  • 0基础学习移动端适配
  • Go 语言编译器的 //go: 详解
  • HTTP 简介
  • IDEA常用插件整理
  • JavaWeb(学习笔记二)
  • js
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • MySQL QA
  • Python_网络编程
  • ReactNative开发常用的三方模块
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue--为什么data属性必须是一个函数
  • 阿里云购买磁盘后挂载
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 回顾 Swift 多平台移植进度 #2
  • 简单数学运算程序(不定期更新)
  • 京东美团研发面经
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 我有几个粽子,和一个故事
  • 我与Jetbrains的这些年
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 译自由幺半群
  • 《码出高效》学习笔记与书中错误记录
  • #stm32整理(一)flash读写
  • (4)STL算法之比较
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)程序员技术练级攻略
  • .a文件和.so文件
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .Net中wcf服务生成及调用