栈的压入、弹出序列
题目
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
思路:
辅助栈+贪心算法
持续将pushed的元素入栈,然后每次都判断栈顶元素等于待出栈元素(poped),如果最后还剩元素则false。
总结:
列表获取尾元素用list[-1]
C++
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int n=popped.size();
int m=pushed.size();
if (n!=m)
return false;
stack<int> help_stack;
int j=0;
for(int i=0; i<m; ++i) //持续将pushed里的元素入栈,如果判断栈顶元素等于待出栈元素,则出栈
{
help_stack.push(pushed[i]);
while(!help_stack.empty() && popped[j]==help_stack.top())
{
help_stack.pop();
j++;
}
}
return help_stack.empty();
}
};
python
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
n = len(popped)
m = len(pushed)
if m!=n:
return false;
help_stack = []
j = 0 # poped计数
for i in range(0, m):
help_stack.append(pushed[i])
while len(help_stack)!=0 and help_stack[-1]==popped[j]:
help_stack.pop()
j +=1
return not len(help_stack)