Olá pessoal!
Fiz este algoritmo usando a Classe Stack, tudo que está aí fiz pesquisando no Google, mas agora empaquei nisso, como fazer uma Stack de 10 elementos?
Obs: esse código aí não está rodando como queria, que seria empilhar 10 elementos e desempilhar logo após selecionar a opção 2.
package exercicio3;
import java.util.Stack;
import javax.swing.JOptionPane;
/**
*
* @author
*/
public class EmpDesemp {
int opcao;
String incluir;
String excluir;
public void executar() {
Stack<Integer> pilha = new Stack<Integer>();
int i;
incluir = "S";
excluir = "S";
do {
opcao = Integer.parseInt(JOptionPane.showInputDialog(null, "1 - Empilha" + "\n2- Desempilha" + "\n3 - Sair"));
switch (opcao) {
case 1:
{
do {
for(i=0;i<10;i++) {
pilha.push(Integer.parseInt(JOptionPane.showInputDialog("Informe valores para empilhar")));
incluir = JOptionPane.showInputDialog(null, "Deseja empilhar outro? S/N:", "Entrada", 3);
incluir.toUpperCase();
}
} while (incluir.equals("S"));
}
break;
case 2: {
do {
if (pilha.isEmpty()) {
JOptionPane.showMessageDialog(null, "Pilha Vazia!", "Aviso!", 2);
excluir = ("N");
} else {
excluir = JOptionPane.showInputDialog(null, "Deseja desempilhar outro? S/N:", "Entrada", 3);
excluir = excluir.toUpperCase();
pilha.pop();
}
for (i = 0; i < 10; i--) {
JOptionPane.showMessageDialog(null,Integer.toString(pilha.pop()) ,"Resultado",2);
}
} while (excluir.equals("S"));
}
}
} while (opcao != 3);
}
}
[]s
O que seu código deveria fazer?
Essa parte vai rodar 10 vezes independente de responder sim ou nao. A diferença é na 10° vez que vai sair do for e verificar no while.
for(i=0;i<10;i++) {
pilha.push(Integer.parseInt(JOptionPane.showInputDialog("Informe valores para empilhar")));
incluir = JOptionPane.showInputDialog(null, "Deseja empilhar outro? S/N:", "Entrada", 3);
incluir.toUpperCase();
}
Olá Mark, o que eu quero é empilhar 10 numeros no case 1 e desempilhar os 10 no case 2.
Só que ainda não descobri como fazer uma Stack de 10 elementos, pq ai eu removia aquele For.
[]s
Vamos empilhar 10 elementos e desempilhá-los.
Stack<Integer> pilha = new Stack<Integer>();
for (int i = 1; i <= 10; ++i) {
Integer v = Integer.valueOf (i);
System.out.println (v);
pilha.push (v);
}
while (!pilha.empty()) {
Integer v = pilha.pop();
System.out.println (v);
}
Será que tem algum mistério?
Grato pela atenção mas esse código não serviu, pois queria determinar o tamanho (10 posições) da Stack nesta linha se possível:
Stack<Integer> pilha = new Stack<Integer>();
Criando um vetor de 10 posições:
int pilha[] = new int[10];
Recebendo valores até completar a décima posição:
for(i=0;i<10;i++) {
valor = Integer.parseInt(JOptionPane.showInputDialog("Informe valores para empilhar"));
}
Não é dessa forma que eu quero fazer, mas empilhar e desempilhar usando apenas a Classe Stack, ai não vou precisar usar o vetor e nem o “For” para determinar 10 posições e receber os valores digitados, ous seja, quanto menos código melhor.
Se alguém souber como estipular o tamanho da pilha logo no começo do algoritmo usando a Classe Stack eu agradeço.
[]s
Você está misturando abobrinhas e quiabos.
A classe Stack é uma pilha de tamanho indeterminado. (Dentro dela existe um Vector, mas isso é um detalhe de implementação. )
O tamanho de uma pilha é dado pela quantidade de elementos empilhados.
Ou seja, você só terá uma pilha de tamanho 10 se tiver 10 elementos empilhados dentro dela.
Agora você tirou da cartola um array. Para que você quer o tal array? Ou você usa um array, ou você usa a classe Stack. Se quiser criar uma pilha usando um array, então você é que tem de controlar isso; você vai precisar de uma variável auxiliar do tipo int, contendo um índice para o topo da pilha.
Analisei seu problema na correria, pois estou de saída para o Maracanã.
Veja se é disso que precisa. Se for, custa nada dizer: a API do Java é sua amiga.
Stack<Integer> pilha = new Stack<Integer>();
for (int i = 0; i < 20; i++) {
pilha.push(i);
}
pilha.setSize(10);
pilha.trimToSize();
System.out.println(pilha.capacity());
Tem essa outra forma:
package br.com.celsomartins.stack;
import java.util.Stack;
@SuppressWarnings("serial")
public class MinhaPilha<Type> extends Stack<Type> {
private Long maxSize = 0L;
public MinhaPilha(Long maxSize){
this.maxSize = maxSize;
}
@Override
public Type push(Type item) throws StackOverflowError{
if (this.size() > maxSize){
throw new StackOverflowError("O tamanho máximo da pilha foi atingido");
}else{
super.push(item);
}
return item;
}
}
Testei assim:
MinhaPilha<Integer> pilha = new MinhaPilha<Integer>(10L);
for (int i = 0; i < 20; i++){
pilha.push(i);
}
Qualquer erro deve ser perdoado, pois essa classe foi feita após um jogão no Maracanã que terminou em 0 a 0.
Tem que trocar o > do método sobrescrito por ==. A "pilha limitada" está ficando com maxSize + 1 de tamanho.
Eu fiquei com a pulga atrás da orelha… para que diabos será que serve isso? Um pilha limitada.
Consegui fazer o que eu queria! Uma pilha usando Stack, definindo 10 elementos para empilhar.
[code]package exercicio3;
import java.util.Stack;
import javax.swing.JOptionPane;
/**
*
-
@author Guevara
*/
public class EmpDesemp {
public void executar() {
Stack<Integer> valor = new Stack<Integer>();
Integer opcao;
String incluir;
String excluir;
incluir = "S";
excluir = "S";
do {
opcao = Integer.parseInt(JOptionPane.showInputDialog(null, "1 - Empilha" + "\n2- Desempilha" + "\n3 - Sair"));
switch (opcao) {
case 1:
{
do {
if (valor.size() > 9) {
JOptionPane.showMessageDialog(null, "Pilha já está cheia", "Saída", 1);
incluir = "N";
} else {
valor.push(Integer.parseInt(JOptionPane.showInputDialog(null, "Informe o valor para empilhar", "Entrada", 3)));
incluir = JOptionPane.showInputDialog(null, "Deseja empilhar outro valor? S/N", "Entrada", 3);
incluir = incluir.toUpperCase();
}
} while (incluir.equals("S"));
}
break;
case 2: {
do {
if (valor.isEmpty()) {
JOptionPane.showMessageDialog(null, "Pilha Vazia!", "Aviso!", 2);
excluir = ("N");
} else {
//criei um objeto para armazenar o que esta sendo retirado da pilha
Object aux = valor.pop();
excluir = JOptionPane.showInputDialog(null, "Deseja desempilhar outro? S/N:", "Entrada", 3);
excluir = excluir.toUpperCase();
JOptionPane.showMessageDialog(null, "O valor " + aux + " foi desempilhado", "Saída", 1);
//O objeto aux mostra o que ele armazenou do pop()
}
} while (excluir.equals("S"));
}
}
} while (opcao != 3);
}
}
[/code]
Fica ai o algoritmo para quem precisar.
[]s