Structure de données et algorithme série 3 scénarios d'utilisation de la pile et de la pile

Définition de pile

Dernier entré premier sorti, premier entré dernier sorti, est une table linéaire avec des opérations limitées, permettant à une seule extrémité d'insérer et de supprimer des données. La plupart des scènes qui utilisent la pile peuvent être remplacées par des tableaux ou des listes chaînées, mais les tableaux et les listes chaînées exposent trop d'interfaces d'opération, qui semblent très flexibles, mais les risques correspondants ont augmenté et sont devenus plus incontrôlables.

Pile à volume constant

Autrement dit, la taille d'une pile est spécifiée lors de sa création

Créer une pile à volume constant

Paradigme inutilisé

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;
    }
}

Utiliser le paradigme

Remarque: il n'est pas permis de créer un tableau générique pour des raisons historiques et techniques

Code d'implémentation

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;
    }
}

Optimisation du code

question 1

Aperçu du problème

Choix d'un tableau pour indiquer que le contenu de la pile doit pré-estimer la capacité maximale de la pile. En Java, la taille du tableau ne peut pas être modifiée une fois qu'il est créé, de sorte que l'espace utilisé par la pile ne peut être qu'une partie de cette capacité maximale. Les cas d'utilisation de grande capacité gaspillent beaucoup de mémoire lorsque la pile est vide ou presque vide. Par exemple, un système de transaction peut impliquer des milliards de transactions et une collection de milliers de transactions. Même si ce système limite généralement chaque transaction à apparaître dans un seul ensemble, le cas d'utilisation doit garantir que tous les ensembles ont la capacité de stocker toutes les transactions. En revanche, si l'ensemble devient plus grand que le tableau, le cas d'utilisation peut déborder. . Par conséquent, nous avons besoin d'une méthode pour détecter si la pile est pleine et d'une méthode pour étendre la pile. C'est en fait l'idée d'un tableau dynamique

solution

La méthode isFull () détermine si la pile est pleine

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

méthode d'expansion 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;
    }

question 2

Présentation du problème 2

Si nous sortons une grande quantité de données pendant l'utilisation, mais que l'espace du tableau précédent est très grand, nous devons également réduire dynamiquement la capacité de la pile pour maximiser l'utilisation de la mémoire

solution

Lors de l'appel de la fonction pop () pop, nous supprimons d'abord l'élément en haut de la pile, puis si le tableau est trop grand, nous diviserons par deux la longueur du tableau

Scénarios d'utilisation de la pile

Prenons l'exemple du navigateur que nous utilisons habituellement. Lorsque nous cliquons sur plusieurs pages Web de la même page, nous utilisons souvent les boutons Précédent et Suivant du navigateur pour revenir à la page ouverte précédente et à la page suivante ouverte.

Insérez la description de l'image ici

Par exemple, nous avons ouvert dans la page unifiée

taobao.com
jd.com
tx.com

Lorsque nous cliquons sur la flèche gauche, nous retournons sur jd.com

Lorsque nous cliquons à nouveau sur la flèche droite, nous retournons sur taobao.com

Cette opération peut être réalisée en utilisant le diagramme stack
**

Insérez la description de l'image ici

Lorsque nous cliquons sur la flèche gauche, nous retournons sur jd.com

Insérez la description de l'image ici

Lorsque nous cliquons à nouveau sur la flèche droite, nous retournons sur taobao.com

Insérez la description de l'image ici

Des scénarios d'application similaires ont également la fonction d'annulation et de récupération du logiciel

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/pjh88/article/details/114401963
conseillé
Classement