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

 

分析和思路:

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几行,完成的功能是一样,简洁高效,思维清晰,非常值得学习。

 

posted @ 2022-02-20 17:38  技术笔记记录  阅读(237)  评论(0)    收藏  举报