• 剑指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上答案的时候,发现参考了答案之后也报错,不能一味的相信答案。答案在中间我注释的地方没有考虑到,因此死循环了。

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

  • 相关阅读:
    Android Fragment 解析和使用
    Android数据库表的创建和数据升级操作
    Android通过xml文件配置数据库
    Android上的事件流操作数据库
    Android SQLite的ORM接口实现(一)---findAll和find的实现
    Android注解编程的第一步---模仿ButterKnife的ViewBinder机制
    Android下拉刷新底部操作栏的隐藏问题
    Android开发总结
    一个ListView布局的不断演化
    SpringBoot入门-概念(一)
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11015159.html
Copyright © 2020-2023  润新知