剑指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