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.
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
**
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
Des scénarios d'application similaires ont également la fonction d'annulation et de récupération du logiciel