题解 | #栈的压入、弹出序列#
栈的压入、弹出序列
https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106
class Solution { public: bool IsPopOrder(vector<int>& pushV, vector<int>& popV) { stack<int> s; // 创建一个栈s,用于模拟入栈和出栈操作 int j = 0; // 定义一个指针j,表示popV数组中的索引 for(int i = 0; i < pushV.size(); i++) { s.push(pushV[i]); // 将pushV[i]入栈 // 当栈不为空且栈顶元素等于popV[j]时,说明栈顶元素可以出栈 while(!s.empty() && s.top() == popV[j]) { j++; // 指针j右移,指向popV数组的下一个元素 s.pop(); // 将栈顶元素出栈 } } return s.empty(); // 如果栈为空,说明pushV数组的入栈顺序和popV数组的弹出顺序是合法的,返回true;否则返回false } };
解题思路
解题思路如下:
我们可以使用一个辅助栈来模拟入栈和出栈的操作。具体的解题思路如下:
- 首先,我们创建一个空栈s用于模拟入栈和出栈操作,创建一个指针j,初始值为0,表示出栈顺序的索引。
- 对于入栈顺序pushV中的每个元素pushV[i],将其依次入栈到栈s中。
- 在入栈操作后,我们需要进行以下判断:对于栈s的栈顶元素s.top(),如果s.top()等于出栈顺序popV[j],则说明栈顶元素可以出栈。我们将指针j右移,指向出栈顺序的下一个元素,表示已经找到了一个合法的出栈元素。
- 重复进行上述判断和操作,直到栈s为空或者栈顶元素不等于出栈顺序popV[j]。
- 最后,我们判断栈s是否为空。如果栈s为空,说明入栈顺序和出栈顺序是合法的,返回true;否则返回false。