Estou tentando instanciar um objeto da classe Pilha que eu criei.
public class Pilha{
public ArrayList <Integer> data; // declara a pilha, apenas
public Pilha(int tamanho){
data = new ArrayList<Integer>(); // inicializa a pilha com o tamanho informado
}
public void Push(Integer elm){
data.add(elm); // adiciona o elemento informado ao topo
}
public Integer Pop(){
if(data.size() == 0){
throw new IllegalStateException("Pilha vazia. ");
}
return data.remove((data.size() - 1)); // remove o elemento no indice do topo
}
public Integer Top(){
if(data.size() == 0){
throw new IllegalStateException("Pilha vazia. ");
}
return data.get(data.size() - 1); // retorna o topo da pilha
}
public boolean isEmpty(){
return data.isEmpty(); // retorna se está vazia
}
public int Size(){
return data.size(); // retorna o numero de elementos no ArrayList
}
}
Criei um menuzinho na main pra testar essa classe, mas acontece um erro nesta terceira linha:
System.out.println("Bem vindo! insira o tamanho da pilha: ");
tamanho = input.nextInt();
Pilha stack = new Pilha(tamanho); // erro
o erro é o non-static variable this cannot be referenced from a static context
Não consigo identificar a solução. Podem me ajudar?
Consegui resolver o problema. Mudei a classe para static e rodou.
public class Teste {
public static void main(String[] args){
int tamanho;
int choice;
int aux;
boolean check;
Scanner input = new Scanner(System.in);
System.out.println("Bem vindo! insira o tamanho da pilha: ");
tamanho = input.nextInt();
Pilha stack = new Pilha(tamanho);
do{
System.out.println("Escolha uma opcao; ");
System.out.println("1 - Inserir elemento; ");
System.out.println("2 - Remover elemento; ");
System.out.println("3 - Consultar topo da pilha; ");
System.out.println("4 - Verificar se esta vazia; ");
System.out.println("5 - Tamanho da pilha; ");
System.out.println("6 - Sair; ");
choice = input.nextInt();
switch(choice){
case 1: // PUSH
int elm;
System.out.print("digite o elemento que deseja inserir: ");
elm = input.nextInt();
stack.Push(elm);
break;
case 2: // POP
aux = stack.Pop();
System.out.println("Elemento " + aux + " removido!");
break;
case 3: // Top
aux = stack.Top();
System.out.println("Topo atual: " + aux);
break;
case 4: // isEmpty
check = stack.isEmpty();
System.out.println("Pilha vazia: " + check);
break;
case 5: // Size
aux = stack.Size();
System.out.println("Tamanho atual da pilha: " + aux);
break;
case 6:
break;
}
}while(choice != 6);
}
public static class Pilha{
private ArrayList <Integer> data; // declara a pilha, apenas
public Pilha(int tamanho){
data = new ArrayList(tamanho); // inicializa a pilha com o tamanho informado
}
public void Push(Integer elm){
data.add(elm); // adiciona o elemento informado ao topo
}
public Integer Pop(){
if(data.size() == 0){
throw new IllegalStateException("Pilha vazia. ");
}
return data.remove(data.size() - 1); // remove o elemento no indice do topo
}
public Integer Top(){
if(data.size() == 0){
throw new IllegalStateException("Pilha vazia. ");
}
return data.get(data.size() - 1); // retorna o topo da pilha
}
public boolean isEmpty(){
return data.isEmpty(); // retorna se está cheia
}
public int Size(){
return data.size(); // retorna o numero de elementos no ArrayList
}
}
}
Não sei se entendi corretamente o conceito da Pilha usando ArrayList em Java ou se implementei errado, pois a pilha ainda recebe elementos mesmo após ter excedido o tamanho (então esse atributo ficou inútil), mas pelo menos agora rodou. Já é um avanço.
É que normalmente não se usa arraylist para isso, afinal, este tipo de objeto possui alocação dinâmica de memória, o que significa que você tem como limite o total de memória disponível configurado para o java. O ideal seria vetor mesmo, que te limita a X posições.
Com arraylist, o ideal é ter uma variável de controle que limite o tamanho da lista. chegou aquele tamanho, impede a inserção de novos objetos.
Concordo com você, mas o professor exigiu que fosse utilizando ArrayList. Pra limitar o tamanho, eu usei o atributo tamanho, porém a pilha continua recebendo mesmo após o número de elementos ser igual ao limite (ela não sobescreve dado algum, apenas continua recebendo até o total de memória disponível kkk)