eu gostaria de converter uma expressao matematica do tipo = (12 + 1)
eu crio a string com essa expressao, mas quero mandar ela neste formato para um array de char…
tipo char[0] = ‘(’ ;
char[1]= ‘12’ ;
char[2]= ‘+’ ;
char[3]= ‘1’;
char[4]= ‘)’;
Isso aí é uma necessidade que surgiu na aula de linguagens formais ou compiladores?
Se for… melhor estudar o material que seu professor sugeriu, em especial na parte de análise léxica e sintática.
Se não for, dê uma olhada em APIs prontas para isso, como o AntLR, ou alguma que avalie a expressão diretamente.
é porque eu preciso criar um programa em java que faça conversao de uma expressao pos-fixada para infixada e vice-versa.
o problema que e aula de estrtura de dados entao preciso usar uma TAD pilha para fazer a conversao.
essa TAD pilha foi implementada por mim.
mas nao to conseguindo passar a expresao de maneira que teria como eu manipular ela na pilha. entendeu?
Basta acumular o número, até que você encontre um símbolo.
Veja se o algoritmo abaixo ajuda:
String numero = ""
para cada caracter na string
inicio
Se for um número
Numero = numero + simbolo;
Senão Se for um símbolo matemático
inicio
Processe o simbolo com a pilha
Armazene de alguma forma o numero
Numero = ""
fim
fim
[code]public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String exp2;
System.out.println(“Informe a expressao:”);
String entrada = in.readLine();
exp2 = removeSpaces(entrada);
System.out.println(exp2);
}
public static String removeSpaces(String s) {
StringTokenizer st = new StringTokenizer(s," ",false);
String t="";
while (st.hasMoreElements()) t += st.nextElement();
return t;
}[/code]
retiro os espaços. depois teria como eu percorrer a string?
o problema e que pra expressao infixada funciona aquilo que vc disse, mas se ele informar uma do tipo pos-fixada ja nao funcionaria. esse e o grande problema.
Primeiro de tudo. Se você ler o javadoc da StringTokenizer, vai ver que a própria classe diz que não deve ser mais usada, e que você deve usar split no lugar.
public class Teste {
public static String[] parseExpression(String expression) {
List parsed = new ArrayList();
StringBuilder number = new StringBuilder("");
for (char ch : expression.toCharArray()) {
//Se for um número, acumula os caracteres numa String.
if (Character.isDigit(ch) || ch == '.') {
number.append(ch);
continue;
}
//Se não for um número, então adiciona o número acumulado na String
if (number.length() > 0) {
parsed.add(number.toString());
number = new StringBuilder("");
}
//Se for um espaço ou tab, não considera como operação matemática
if (ch == ' ' || ch == '\t') {
continue;
}
//Outros símbolos, considere como operação matemática.
parsed.add(Character.toString(ch));
}
//Como acima os números só foram adicionados quando símbolos foram encontrados
//Precisamos testar se não sobrou um último número sem um simbolo após ele.
if (number.length() >= 0) {
parsed.add(number.toString());
}
//Retorna os valores acumulados, na forma de um array de Strings.
return parsed.toArray(new String[parsed.size()]);
}
public static void main(String[] args) {
System.out.println("Infixa");
for (String str : parseExpression("(12 + 4) * 15.45")) {
System.out.println(str);
}
System.out.println("Posfixa");
for (String str : parseExpression("12 4 5.34 + -")) {
System.out.println(str);
}
}
[quote=rsom91]muito obrigado …
desculpa por ser tao iniciante…
e quanto a API nao domino muito o ingles nao…[/quote]
Não precisa pedir desculpa. Só não peça para eu entregar também o conversor. Esse trabalho é seu (eu já fiz um desse em 1997, pra escola).
E, quando terminar e tiver funcionando, volta aqui no tópico e posta a solução.