Verificar la secuencia de empujar y hacer estallar la pila

leetcode se refiere a oferta31 y método946

tema:

Dadas dos secuencias, empujadas y extraídas, donde los valores de cada secuencia no están duplicados, devuelve verdadero solo si pueden ser el resultado de una secuencia de operaciones de inserción y extracción en una pila inicialmente vacía; de lo contrario, devuelve falso.

Por ejemplo:

Entrada: push = [1,2,3,4,5], popped = [4,5,3,2,1]
Salida: true
Explicación: Podemos ejecutar en el siguiente orden:
push(1), push(2 ) , empujar(3), empujar(4), pop() -> 4,
empujar(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

Idea: Empuje hacia la pila en secuencia. Cada vez que se empuja, compare el valor que obtiene con el valor señalado por el subíndice de la matriz emergente. Cada vez que tiene éxito, el subíndice retrocede uno y el elemento simplemente Empujado a la pila es Después de hacer estallar la pila, aún no ha terminado. Aún debe continuar juzgando si el elemento en la parte superior de la pila en este momento es el mismo que el elemento señalado por estallar. Si son iguales , el bucle continuará; si son diferentes, el bucle saldrá. Luego se juzga si el bucle salta de la pila porque no cumple con la secuencia de extracción. Si es así, se devuelve falso. De lo contrario, el bucle anterior continúa ejecutándose. Si no se devuelve falso hasta que la pila esté vacía al final, significa que no solo todos los elementos de la pila se insertan en la pila, sino que también se extraen en el orden de las ventanas emergentes, lo que significa que las ventanas emergentes cumplen con los requisitos. y se devuelve verdadero;
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        //思路:将pushed依次入栈,每入一次,就拿入的这个值和poped数组的下标
        //指向的值进行对比,每成功一次,下标
        //就向后移动一个,并且将刚入栈的元素进行出栈,代表它符合出栈顺序
        Stack<Integer> stack = new Stack<>();
        int ondex = 0;//遍历pushed的索引
        int index = 0;//定义一个遍历popped的索引
        for (int i = 0; i < pushed.length; i++) {
            int a = pushed[i];
            stack.push(a);
            while (!stack.isEmpty()) {
                int b = stack.peek();
                if (b == popped[index]) {
                    stack.pop();
                    index++;
                } else {
                    break;
                }
            }
            //这三个条件可以百分百确定poped不符合题目要求
            if (i == pushed.length - 1 && !stack.isEmpty() && index < popped.length - 1) {
                return false;
            }
        }
        return true;
    }

Resumen: es una prueba de las reglas de explosión de la pila, es decir, primero en entrar, primero en salir. Requiere que estemos muy familiarizados con ella. Al mismo tiempo, debemos pensar desde otro ángulo. Podemos juzgar si popped se ajusta a las reglas de popping al crear otra pila y simular el proceso de popping.

Supongo que te gusta

Origin blog.csdn.net/weixin_52394141/article/details/131314562
Recomendado
Clasificación