题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
注意:
- 若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列。
样例
Input: [1,2,3,4,5]
[4,5,3,2,1]
Output:true
解题思路
-
描述
本题目假定压入栈的所有数字均不相等,这就简化了问题。
那么当序列依次压入栈中时,如果当前栈顶元素与弹出序列对应元素相同,则该元素就一定是此时弹栈的。
-
实现代码:
bool isPopOrder(vector<int> pushV,vector<int> popV) { if(pushV.empty() || popV.empty()) // 两者均空,返回true,一空一非空,返回false { return pushV.empty() && popV.empty(); } if(pushV.size() != popV.size()) // 两者长度不等,返回false { return false; } stack<int> stk; int j = 0; for(int i=0;i < pushV.size();i++) { stk.push(pushV[i]); while((!stk.empty()) && stk.top() == popV[j]) // 栈非空且栈顶与弹出序列元素相同 { stk.pop(); // 弹栈 j++; } } if(stk.empty()) // 栈空返回true,否则返回false { return true; } else { return false; } }