Given two sequences pushed
and popped
with distinct values, return true
if and only if this could have been the result of a sequence of push and pop operations on an initially empty stack.
Example 1:
Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1] Output: true Explanation: We might do the following sequence: push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
Example 2:
Input: pushed = [1,2,3,4,5], popped = [4,3,5,1,2] Output: false Explanation: 1 cannot be popped before 2.
Note:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed
is a permutation ofpopped
.pushed
andpopped
have distinct values.
题目理解:
给定一个入栈顺序,和一个出栈顺序,问是否符合出入栈规则
解题思路:
按照入栈顺序和出栈顺序执行出入栈操作。具体的方法是,用一个指针b指向出栈顺序最左边的数,只要栈的顶端不是b,则按照从左至右的顺序将入栈顺序中的元素入栈,如果栈顶的元素是b,则执行出栈操作,并且使b指针右移一位。当入栈操作和出栈操作全部执行完之后,如果栈中还有元素,那么给定的顺序不符合出入栈规则,否则符合。
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
if(pushed.length == 0)
return true;
Stack<Integer> st = new Stack<>();
int left = 0, right = 0;
while(true){
while(left < pushed.length && (st.isEmpty() || st.peek() != popped[right]))
st.push(pushed[left++]);
if(left == pushed.length)
break;
while(!st.isEmpty() && st.peek() == popped[right]){
st.pop();
right++;
}
}
while(!st.isEmpty() && st.peek() == popped[right]){
st.pop();
right++;
}
if(st.isEmpty())
return true;
return false;
}
}