Estructura de datos y algoritmo serie 3 escenarios de uso de pila y pila

Definición de pila

El último en entrar, el primero en salir, el primero en entrar, el último en salir, es una tabla lineal con operaciones limitadas, que permite que solo un extremo inserte y elimine datos. La mayoría de las escenas que usan la pila pueden ser reemplazadas por matrices o listas enlazadas, pero las matrices y listas enlazadas exponen demasiadas interfaces de operación, que parecen ser muy flexibles, pero los riesgos correspondientes han aumentado y se vuelven más incontrolables.

Pila de volumen constante

Es decir, el tamaño de una pila se especifica cuando se crea.

Crea una pila de volumen constante

Paradigma no utilizado

package com.pjh.Stack;
public class FixedCapacityStack {
    /*定义一个数组*/
    private  String[] a;
    /*定义一个大小*/
    private int N;
    /*有参构造方法*/
    public FixedCapacityStack(int n) {
       a=new String[n];
    }
    /*判断数组是否为空*/
    public boolean isEmpty(){
        return N==0;
    }
    /*返回数组的大小*/
    private int size(){
        return N;
    }
    /*出栈*/
    public String pop(){
        return a[--N];
    }
    /*入栈*/
    public void push(String item){
        a[N++]=item;
    }
}

Usar paradigma

Nota: No está permitido crear una matriz genérica debido a algunas razones históricas y técnicas.

Código de implementación

package com.pjh.Stack;
public class FixedCapacityStack2<Item> {
    /*定义一个数组*/
    private Item a[];
    /*定义一个大小*/
    private int N;
    /*有参构造方法*/
    public FixedCapacityStack2(int n) {
        a=(Item[]) new Object[n];
    }
    /*判断数组是否为空*/
    public boolean isEmpty(){
        return N==0;
    }
    /*返回数组的大小*/
    private int size(){
        return N;
    }
    /*出栈*/
    public Item pop(){
        return a[--N];
    }
    /*入栈*/
    public void push(Item item){
        a[N++]=item;
    }
}

Optimización de código

Pregunta 1

Resumen del problema

Elegir una matriz para indicar que el contenido de la pila debe preestimar la capacidad máxima de la pila. En Java, el tamaño de la matriz no se puede cambiar una vez que se crea, por lo que el espacio utilizado por la pila solo puede ser una parte de esta capacidad máxima. Los casos de uso con gran capacidad desperdiciarán mucha memoria cuando la pila esté vacía o casi vacía Por ejemplo, un sistema de transacciones puede involucrar miles de millones de transacciones y una colección de miles de transacciones. Aunque este sistema generalmente limita cada transacción para que aparezca en un solo conjunto, el caso de uso debe garantizar que todos los conjuntos tengan la capacidad de almacenar todas las transacciones. Por otro lado, si el conjunto se vuelve más grande que la matriz, el caso de uso puede desbordarse . Por lo tanto, necesitamos un método para detectar si la pila está llena y un método para expandir la pila. Esta es en realidad la idea de una matriz dinámica.

solución

El método isFull () determina si la pila está llena

 /*判满方法,只供内部方法调用*/
    private void isFull(){
        /*如果满了则调用数组扩容方法,扩容的倍数可以根据实际的需要调节*/
        if (N==a.length){
            resize();
        }
    }

método de expansión resize ()

private void resize(){
        int newCapacity= (int) (a.length * 2);
        int lastCapacity=a.length;
        Item[] newArray =  (Item[]) new Object[newCapacity];
        for (int i = 0; i < lastCapacity; i++)
            newArray[i]=a[i];
        /*将a数组的首地址指向newArray数组*/
        a=newArray;
    }

Pregunta 2

Resumen del problema 2

Si extraemos una gran cantidad de datos durante el uso, pero el espacio de la matriz anterior es muy grande, también debemos reducir dinámicamente la capacidad de la pila para maximizar el uso de la memoria

solución

Al llamar a la función pop () pop, primero eliminamos el elemento en la parte superior de la pila, y luego, si la matriz es demasiado grande, reduciremos a la mitad la longitud de la matriz

Escenarios de uso de la pila

Tomemos como ejemplo el navegador que usamos habitualmente. Cuando hacemos clic en varias páginas web en la misma página, a menudo usamos los botones de avance y retroceso del navegador para volver a la página abierta anterior y a la siguiente página abierta.

Inserte la descripción de la imagen aquí

Por ejemplo, hemos abierto en la página unificada.

taobao.com
jd.com
tx.com

Cuando hacemos clic en la flecha izquierda, regresamos a jd.com

Cuando volvemos a hacer clic en la flecha derecha, volvemos a taobao.com

Esta operación se puede lograr utilizando el diagrama de pila
**

Inserte la descripción de la imagen aquí

Cuando hacemos clic en la flecha izquierda, regresamos a jd.com

Inserte la descripción de la imagen aquí

Cuando volvemos a hacer clic en la flecha derecha, volvemos a taobao.com

Inserte la descripción de la imagen aquí

Los escenarios de aplicaciones similares también tienen la función de deshacer y recuperar del software

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/pjh88/article/details/114401963
Recomendado
Clasificación