Estructuras de datos y algoritmos: pilas secuenciales y operaciones básicas (incluidos push y pop)

Pila secuencial, es decir, se implementa una estructura de almacenamiento de pila con una tabla secuencial. A través del estudio anterior, sabemos que el uso de la estructura de almacenamiento de pila para operar elementos de datos debe cumplir con el principio de "primero en entrar, último en salir". Lo siguiente es "Cómo usar la tabla de secuencia para simular la pila y realizar las operaciones básicas sobre los datos en la pila (haciendo estallar y empujando)" Darle una introducción detallada.

Si observa cuidadosamente la tabla de secuencia (la implementación subyacente es una matriz) y la estructura de la pila, encontrará que la forma en que almacenan datos es muy similar, excepto que la pila tiene restricciones especiales en el proceso de acceso a datos, mientras que la tabla de secuencia no es.

Por ejemplo, primero usamos la tabla secuencial (una matriz) para almacenar  {1,2,3,4}y el estado de almacenamiento se muestra en la siguiente figura:

Almacenamiento de tabla secuencial {1,2,3,4}

De manera similar, utilizando la estructura de almacenamiento de pila para almacenar  {1,2,3,4}, su estado de almacenamiento se muestra en la siguiente figura:

La estructura de la pila almacena {1,2,3,4}

De la comparación de las dos figuras anteriores, no es difícil ver que es muy simple usar la tabla de secuencia para simular la estructura de la pila, y solo necesita almacenar los datos en orden desde la posición donde se encuentra el subíndice de la matriz. es 0

Es un método común para almacenar datos de la pila de simulación cuyo subíndice es 0. También es posible almacenar datos de otros subíndices de la matriz. Esto es solo para que lo entiendan los principiantes.

Después de comprender la pila de simulación de tabla de secuencia para almacenar datos, veamos cómo simular la operación de elementos emergentes en la pila. Dado que la pila tiene el requisito de "primero en entrar, último en salir" para el orden de almacenamiento de elementos, si desea eliminar el elemento 1 almacenado en la Figura 1 de la pila, debe eliminar el elemento 4, el elemento 3 y el elemento 2 de la pila a su vez.

Aquí hay una idea de implementación común de usar la tabla de secuencias para simular la estructura de almacenamiento de la pila, es decir, establecer una variable (generalmente llamada top) en la tabla de secuencias que apunte al elemento superior de la pila en tiempo real, y el El valor inicial de top es -1, lo que indica que no hay almacenamiento en la pila elementos de datos, y la pila es la "pila vacía". Una vez que se inserta un elemento de datos en la pila, top realizará la operación +1; de lo contrario, si se extrae el elemento de datos, top realizará la operación -1.

Elementos de pila secuencial "empujados"

Por ejemplo, sigue siendo el proceso de simulación de almacenamiento de pilas  {1,2,3,4} . Inicialmente, la pila es una "pila vacía", es decir, la matriz está vacía y el valor superior es el valor inicial -1, como se muestra en la siguiente figura:

Diagrama de pila vacía

Primero, agregue el elemento 1 a la pila. De manera predeterminada, el subíndice de la matriz es 0, lo que significa que se encuentra en la parte inferior de la pila. Por lo tanto, el elemento 1 se almacena en la matriz a[1], y el valor superior es +1, como se muestra en la siguiente figura:

Elemento de almacenamiento de pila analógica 1

Usando el método anterior, almacene los elementos 2, 3 y 4 en secuencia, y finalmente, el valor superior se convierte en 3, como se muestra en la siguiente figura:

Simular almacenamiento de pila {1,2,3,4}

Por lo tanto, el código de implementación del lenguaje C es:

//元素elem进栈,a为数组,top值为当前栈的栈顶位置
int push(int* a,int top,int elem){
    a[++top]=elem;
    return top;
}

a[++top]=elem en el código es equivalente a ejecutar ++top primero y luego ejecutar a[top]=elem.

Elementos de pila secuencial "reventados"

De hecho, la configuración de la variable superior no tiene ayuda práctica para la operación de "pila" de datos simulados, es para preparar la operación de datos "fuera de la pila".

Por ejemplo, para sacar el elemento 2 de la figura anterior de la pila, primero debe sacar el elemento 4 y el elemento 3 de la pila. Cabe señalar que cuando hay datos fuera de la pila, la parte superior debe establecerse en -1. Por lo tanto, el proceso de estallido del elemento 4 y el elemento 3 se muestra en la siguiente figura a) y b) respectivamente:

Los elementos de datos se extraen de la pila

Tenga en cuenta que la desaparición de los elementos en la matriz anterior es solo para comodidad de los principiantes. De hecho, aquí solo es necesario hacer una operación -1 en el valor superior, porque el valor superior en sí mismo indica la posición superior de la pila, por lo tanto, superior -1 es equivalente a hacer estallar el elemento en la parte superior de la pila. Y cuando agregue elementos a la pila más adelante, el nuevo elemento se almacenará en la posición del elemento anterior como el elemento 4, y el elemento anterior se sobrescribirá.

Después de que los elementos 4 y 3 se hayan extraído, se puede extraer el elemento 2. Por lo tanto, el código de implementación del lenguaje C para simular la operación emergente de datos usando la tabla de secuencia es:

//数据元素出栈
int pop(int * a,int top){
    if (top==-1) {
        printf("空栈");
        return -1;
    }
    printf("弹栈元素:%d\n",a[top]);
    top--;
    return top;
}

La declaración if en el código es para evitar que el usuario realice la operación incorrecta de "no hay datos en la pila, pero los datos deben extraerse de la pila". En el código, para la implementación de la extracción de elementos en la pila, solo se requiere el valor superior -1.

Resumir

Al aprender la tabla de secuencias y simular la operación de entrada y salida de datos de la pila, los principiantes han completado el estudio de la pila de secuencias. Aquí está el código completo de la pila de secuencias y las operaciones básicas sobre los datos en lenguaje C:

#include <stdio.h>
//元素elem进栈
int push(int* a,int top,int elem){
    a[++top]=elem;
    return top;
}
//数据元素出栈
int pop(int * a,int top){
    if (top==-1) {
        printf("空栈");
        return -1;
    }
    printf("弹栈元素:%d\n",a[top]);
    top--;
    return top;
}
int main() {
    int a[100];
    int top=-1;
    top=push(a, top, 1);
    top=push(a, top, 2);
    top=push(a, top, 3);
    top=push(a, top, 4);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    return 0;
}

La salida del programa es:

弹栈元素:4
弹栈元素:3
弹栈元素:2
弹栈元素:1
空栈

2023 nueva versión de estructura de datos y algoritmo Java video tutorial (Parte 1), estructura de datos y algoritmo que los programadores senior de Java deben aprender
2023 nueva versión de estructura de datos y algoritmo Java video tutorial (parte 2), estructura de datos y algoritmo que Java programador senior debe aprender

Supongo que te gusta

Origin blog.csdn.net/Itmastergo/article/details/131890910
Recomendado
Clasificación