剑指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上答案的时候,发现参考了答案之后也报错,不能一味的相信答案。答案在中间我注释的地方没有考虑到,因此死循环了。
最后,我想写一点最近关于学习的感悟。首先,学习是自己的事,因此你在学习的时候不要跟别人做比较。跟别人比容易迷失自己,只要自己清楚自己的该做什么,以什么样的进度去做就够了,多关注自己。我知道这样很难,但是我想一点一点去努力尝试做到。其次,学习的目的可以提高自己,也可以是开阔眼界,但绝对不是让别人觉得我爱学习,别虚荣,没有一点意义。再说了,你学习不学习,除了你自己,还有谁真的在乎呢?