算法-栈-之栈的压入、弹出序列

分析和思路:
1,首先栈的有一个元素
2,栈有了元素后就需要和pop里的元素去做对比,栈顶的元素和当前的pop队列第一个元素相等,就出栈,否则就不停的压栈。循环判断用的是pop和push的索引是否到了它们的最大值。
3,判断栈是否为空,如果为空就为真,否则为假。
1 bool IsPopOrder(vector<int> pushV,vector<int> popV) { 2 3 //这个题目还有一个扩展。就是输入一个压栈队列,输出所有的出栈队列。 4 //对于这个题目的思路是,先按照压栈顺序压栈,然后再跟着出栈顺序选择是继续压栈还是出栈,如果出完栈后,栈中的元素不为空,表示该出栈顺序 5 // 是无法形成的 6 if(pushV.size()==0||popV.size()==0) 7 { 8 return false; 9 } 10 stack<int> m_stack; 11 int i=0; 12 int j=0; 13 m_stack.push(pushV[0]);//先压入一个元素 14 15 while(i<pushV.size()&&j<popV.size()) 16 { 17 int temp=0; 18 //栈没有找到当前出栈的数据时 19 // if(find(m_stack.begin())) 20 // temp=m_stack.top(); 21 if(m_stack.size()!=0&&popV[j]!=m_stack.top()) 22 { 23 while(popV[j]!=m_stack.top()&&i<pushV.size())//压入栈的元素和出栈的元素不相等,需要继续压栈 24 { 25 if(i<pushV.size()-1) 26 { 27 i++; 28 m_stack.push(pushV[i]); 29 } 30 else 31 { 32 return false; 33 } 34 if(i==pushV.size()-1&&popV[j]!=m_stack.top())//入栈队列元素都压完了,但是还没有找到与出栈队列相等的元素,直接返回false; 35 { 36 return false; 37 } 38 } 39 //找到了这个额元素,出栈 40 j++; 41 m_stack.pop(); 42 //如果栈找到了当前出栈的数据,直接出栈即可 43 44 } 45 else if(m_stack.size()!=0) 46 { 47 j++; 48 m_stack.pop(); 49 50 } 51 else if(m_stack.size()==0) 52 { 53 54 if(i<pushV.size()-1) 55 { 56 i++; 57 m_stack.push(pushV[i]); 58 } 59 else 60 { 61 return false; 62 } 63 } 64 } 65 if(m_stack.size()==0) 66 { 67 return true; 68 } 69 else 70 { 71 return false; 72 } 73 74 }
总结:虽然结果正确,思路大体也没有多大问题,但是在写的过程中,不断冒出新的问题,如栈已经为空了,但是入栈和出栈的队列不为空,继续比较的话,程序就崩溃了。还有第一个加的m_stack.push(pushV[0[)的操作感觉很奇怪,导致后面整个索引都乱了。
我的理解是:重点把栈和出栈队列的元素进行对比,辅助入栈队列来参考。其实这个题目重点把入栈和出栈的元素来对比,用栈来辅助参考效果会更好一些。改进后的代码如下:
1 bool IsPopOrder(vector<int> pushV,vector<int> popV) { 2 stack<int> st; 3 int i = 0, j = 0; 4 while (i < pushV.size()) { 5 if (pushV[i] != popV[j]) { 6 st.push(pushV[i++]); 7 } 8 else { 9 ++i, ++j; 10 while (!st.empty() && st.top() == popV[j]) { 11 st.pop(); 12 ++j; 13 } 14 } 15 } // end outer while 16 17 return st.empty(); 18 }
总结:这段代码短短10几行,完成的功能是一样,简洁高效,思维清晰,非常值得学习。
主要为了自己学习

浙公网安备 33010602011771号