J'essaie de trouver la majorité ou le leader, dans une pile qui n'est pas triée, et j'ai des problèmes avec mes tos (variable de début de pile) . Ci-dessous est mon code avec principal inclus. La majorité d'un tableau ou d'une pile est un élément qui apparaît dans le tableau plus de la moitié du temps (arrSize/2).Recherche de la majorité (leader) à l'aide d'un tableau implémentation d'une pile
public class findLeader {
static class ArrayStack{
private int[] stackArr;
private int tos;//top of stack
public ArrayStack(){
stackArr = new int[10];
tos = -1;
}
public ArrayStack(int size){
stackArr = new int[size];
tos = -1;
}
public ArrayStack(int[] arr, int tos){
stackArr = arr;
this.tos = tos;
}
public boolean isEmpty(){
return(tos == -1);
}
public int peek(){
if(isEmpty()){
return -999;
}
return stackArr[tos];
}
public void push(int x){
if(tos == stackArr.length - 1){
return;
}
stackArr[++tos] = x;
}
public int pop(){
if(isEmpty()){
return -999;
}
int popValue = stackArr[tos];
stackArr[tos] = 0;
--tos;
return popValue;
}
public void print(){
if(isEmpty()){
return;
}
for(int i = 0; i <= tos; ++i){
System.out.print(stackArr[i] + " ");
}
System.out.println();
}
}
public static int leader(ArrayStack myStack){
int initSize = myStack.tos + 1; //gets initial size of stack.
int leader; //initialize leader or majority.
while(!myStack.isEmpty()){
leader = myStack.peek();//set first leader variable to the element at the tos.
System.out.println("leader " + leader); //just for debugging
System.out.println("tos " + myStack.tos); //debugging
//System.out.println(isLeader(myStack, initSize, leader)); //debugging
if(isLeader(myStack, initSize, leader)){
return 1;
}
else{
myStack.pop();
}
System.out.println("after function tos " + myStack.tos); //debugging
}
return -1;
}
public static boolean isLeader(ArrayStack myStack, int initSize, int leader){
ArrayStack as = myStack;
int count = 0;
while(!as.isEmpty()){
if(as.peek() == leader){
as.pop();
++count;
}
else{
as.pop();
}
}
//System.out.println(count);
if(count > initSize/2)
return true;
else{
return false;
}
}
public static void main(String[] args) {
int[] arr = {2, 5, 6, 2, 8, 2, 8, 2, 2};
ArrayStack stack = new ArrayStack();
stack.push(5);
stack.push(2);
stack.push(6);
stack.push(2);
stack.push(8);
stack.push(2);
stack.push(2);
stack.push(2);
stack.push(5);
System.out.println(leader(stack));
}
Lorsque le problème se pose est dans le chef de file, et les méthodes isLeader, après l'appel initial de isLeader, tos est renvoyée comme tos = -1 comme cela est démontré de ma sortie ci-dessous.
Sortie:
leader 5
tos 8
after function tos -1
-1
Mon intention est après chaque appel à isLeader() si elle est fausse est retourné, je veux pop la variable tos du haut et appelez isLeader() une fois de plus avec la nouvelle pile plus petite .
Toute aide serait vraiment appréciée, et j'espère que tout le monde va bien!
Merci
Le problème semble être que vous faites apparaître tous les éléments de votre pile dans 'isLeader'. Après le premier appel de 'isLeader' votre pile devrait être vide ou au mieux à moitié vide. Vous aurez besoin d'implémenter 'isLeader' d'une manière qui ne modifie pas votre pile. – dpr
Ahh je vois, peut-être si au lieu de faire sauter les éléments, j'ai juste déplacé les tops dans la pile, pour garder la pile d'origine en place. – Kevag6
Cela va probablement casser votre pile aussi bien que 'tos' est un attribut de la pile. – dpr