PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.
Moderadores: Administradores, Moderadores
por raqh » Domingo Mai 10, 2009 15:57
Olá a todos,
Estou a precisar da vossa preciosa ajuda...
Trata-se de um programa que recebe uma expressão em postfix e retorna o resultado (ou deveria retornar...)
Quando na execução ponho 5 9 8 + 4 6 * * 7 + *, ele retorna uma excepção:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at PilhaArray.pop(PilhaArray.java:
at Postfix.CalculPostFix(Postfix.java:
at Postfix.main(Postfix.java:
De onde vem o problema?
Aqui vai o meu código:
- Código: Seleccionar todos
//CLASSE POSTFIX
import java.io.*;
public class Postfix
{
public static void CalculPostFix(String s2)
{
PilhaArray s = new PilhaArray ();
for (int i = 0; i < s2.length(); i += 2)
{
if (s2.charAt(i) == '+')
s.push(s.pop() + s.pop());
else if (s2.charAt(i) == '*')
s.push(s.pop() * s.pop());
else
{
int num = 0;
do
{
num = num*10 + s2.charAt(i)-'0'; // Constrói número
++i;
}
while (s2.charAt(i) != ' ');
--i;
s.push(num);
}
}
System.out.println(s.pop());
}
public static void main(String[] args) throws IOException
{
BufferedReader stdr = new BufferedReader(new InputStreamReader(System.in));
String line = stdr.readLine();
CalculPostFix(line);
}
}
- Código: Seleccionar todos
//INTERFACE STACK
public interface Stack
{
public void push(int i);
public int pop();
public boolean isEmpty();
}
- Código: Seleccionar todos
//CLASSE PILHAARRAY
public class PilhaArray implements Stack
{
private int[] stack;
private int n;
public PilhaArray()
{
stack = new int[1000000];
n=-1;
}
public boolean isEmpty()
{
return n == -1;
}
public void push(int item)
{
if (n < stack.length)
{
stack[++n] = item;
}
}
public int pop() {
int item = stack[n--];
return item;
}
}
Obrigado pela atenção.
-
raqh
- Novato

-
- Mensagens: 15
- Registado: Sábado Abr 04, 2009 17:43
por raqh » Domingo Mai 10, 2009 18:14
Modifiquei a classe postfix, de forma a integrar a string "5 9 8 + 4 6 * * 7 + *" no código em vez de a ler através do teclado....e para meu espanto já não retorna aquela excepção!
Pus em // a forma como estava a ler string através do teclado para verem como tinha feito. Acho estranho que não funcione através do teclado.
Alguém me pode ajudar?
Obrigado.
- Código: Seleccionar todos
//CLASSE POSTFIX
import java.io.*;
public class Postfix
{
public static void CalculPostFix() throws IOException
{
//BufferedReader tecl = new BufferedReader(new InputStreamReader(System.in));
//System.out.println("string: ");
//String s2 = tecl.readLine();
String s2 = "5 9 8 + 4 6 * * 7 + *";
char[] a = s2.toCharArray();
PilhaArray s = new PilhaArray ();
for (int i = 0; i < s2.length(); i += 2)
{
if (a[i] == '+')
s.push(s.pop() + s.pop());
else if (a[i] == '*')
s.push(s.pop() * s.pop());
else
{
int num = 0;
do
{
num = num*10 + a[i]-'0'; // Constrói número
++i;
}
while (a[i] != ' ');
--i;
s.push(num);
}
}
System.out.println(s.pop());
}
public static void main(String[] args) throws IOException
{
CalculPostFix();
}
}
-
raqh
- Novato

-
- Mensagens: 15
- Registado: Sábado Abr 04, 2009 17:43
por _tribal_ » Domingo Mai 10, 2009 23:19
esse erro significa que estás a tentar a aceder a uma posição do array que não existe, i.e, -1 (se não estou em erro ) .
na console do java aparece a linha do erro, vê lá qual é, de certeza que nesse for, faz com que vás a uma posição do array que não existe.
Para leres do teclado, utiliza a classe Scanner:
- Código: Seleccionar todos
import java.util.Scanner;
Scanner teclado = new Scanner(System.in);
String s2 = teclado.nextLine();
[/quote]
-
_tribal_
- Membro de Ouro

-
- Mensagens: 593
- Registado: Quinta Dez 01, 2005 14:05
por vamosAeles » Segunda Mai 11, 2009 10:35
Boas,
isso é estranho pois o readLine ja não inclui o \n ou \r no fim da String quando lê de um Reader.
Tas a executar isso numa janela de comandos (dos) ou em algum IDE?
Já agora não sei se é suposto, mas se tiveres espaços no início ou no fim, penso isso pode não dar um resultado que estás à espera.
[[]]
-
vamosAeles
- Membro de Prata

-
- Mensagens: 206
- Registado: Quarta Jan 04, 2006 21:29
- Localização: Lisboa/Proença
por JoKeR} » Segunda Mai 11, 2009 21:50
Experimentei o código e não vi nada de mal...
O resultado é 2075.
O mais certo é teres-te enganado e posto mais um + ou um *, porque de resto não há por onde ele errar com essa string

. A contagem vai até ao zero, só se puseres mais um dos outros 2 (+*) é que tenta aceder no -1.
-
JoKeR}
- Membro de Prata

-
- Mensagens: 305
- Registado: Terça Dez 27, 2005 3:43
- Localização: Cacém
Voltar para Programação
Quem está ligado:
Utilizador a ver este Fórum: Nenhum utilizador registado e 1 visitante