luishenriique

Atividade 04 - TAP II

Sep 12th, 2013
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.26 KB | None | 0 0
  1. package br.pucpr;
  2.  
  3. import java.util.*;
  4. import br.pucpr.ed.NoAB;
  5.  
  6. /**
  7.  * Algoritmo para gerar uma árvore binária para representar uma expressão
  8.  * algébrica qualquer.
  9.  *
  10.  * @author s.luis
  11.  */
  12. public class GeradorArvore {
  13.  
  14.     private static Scanner input;
  15.  
  16.     public static void main(String[] args) throws Exception {
  17.         input = new Scanner(System.in);
  18.         String inFix;
  19.         System.out.print("InFix: ");
  20.         inFix = input.next();
  21.         String postFix = infixToPostfix(inFix);
  22.         System.out.println("PostFix: " + postFix);
  23.         System.out.print("Árvore: ");
  24.         montagemArvore(postFix);
  25.     }
  26.  
  27.     /**
  28.      * Verifica qual operador tem precedência na equação
  29.      */
  30.     public static boolean verificaPrecedencia(char op1, char op2) {
  31.         int opp1 = -1, opp2 = -1;
  32.  
  33.         // Verifica qual o operador lido e atribui um valor para ele
  34.         // Caso o operador seja + ou - o valor atribuido será 0
  35.         // Caso o operador seja * ou / o valor atribuido será 1
  36.         switch (op1) {
  37.         case '+':
  38.         case '-':
  39.             opp1 = 0;
  40.             break;
  41.         case '*':
  42.         case '/':
  43.             opp1 = 1;
  44.             break;
  45.         }
  46.         switch (op2) {
  47.         case '+':
  48.         case '-':
  49.             opp2 = 0;
  50.             break;
  51.         case '*':
  52.         case '/':
  53.             opp2 = 1;
  54.             break;
  55.         }
  56.  
  57.         // Retorna verdadeiro caso o operador 1 seja maior que o operador 2
  58.         return op1 > op2;
  59.     }
  60.  
  61.     /**
  62.      * Converte uma equação infix (notação de calculadora normal) para uma
  63.      * equação postfix (notação de calculadora hp)
  64.      */
  65.     public static String infixToPostfix(String inFix) {
  66.         String postFix = "";
  67.  
  68.         // Crie uma pilha vazia
  69.         Stack<Character> pilhaEq = new Stack<Character>();
  70.  
  71.         // Leia o String Infix da esquerda para direita
  72.         for (char aux : inFix.toCharArray()) {
  73.             // Se o caracter for um abre parêntesis, adicione-o à pilha
  74.             if (aux == '(')
  75.                 pilhaEq.push(aux);
  76.  
  77.             // Se o caracter é um operando
  78.             if ((aux >= '0' && aux <= '9') || (aux >= 'a' && aux <= 'z'))
  79.                 // Adcione-o ao String PostFix
  80.                 postFix += aux;
  81.  
  82.             // Se o caracter for um operador
  83.             if (aux == '+' || aux == '-' || aux == '*' || aux == '/') {
  84.                 // E a pilha não estiver vazia, compara a precedência do
  85.                 // caracter e do elemento do topo da pilha
  86.                 while (!pilhaEq.empty()
  87.                         && (verificaPrecedencia(pilhaEq.peek(), aux))) {
  88.                     // Se o elemento do topo da pilha for de maior precedência
  89.                     // remova o elemento e adcione-o ao String
  90.                     postFix += pilhaEq.pop();
  91.                 }
  92.                 // Adcione o caracter lido a pilha
  93.                 pilhaEq.push(aux);
  94.             }
  95.             // Se o caracter for um fecha parêntesis
  96.             if (aux == ')') {
  97.                 // Leia os vários elementos da pilha até encontrar um abre
  98.                 // parêntesis
  99.                 while (pilhaEq.peek() != '(') {
  100.                     // E adcione os elementos ao String postfix
  101.                     postFix += pilhaEq.pop();
  102.                 }
  103.                 // Remova o abre parêntesis
  104.                 pilhaEq.pop();
  105.             }
  106.         }
  107.  
  108.         // Enquanto não esvaziar a pilha
  109.         while (!pilhaEq.empty()) {
  110.             // Remova todos os elementos passando para a String postfix
  111.             postFix += pilhaEq.pop();
  112.         }
  113.  
  114.         // Retorna a equação postfix
  115.         return (postFix);
  116.     }
  117.  
  118.     /**
  119.      * Dada uma equação postfix, monta-se uma árvore binária
  120.      */
  121.     public static void montagemArvore(String postfix) throws Exception {
  122.         // Crie uma pilha vazia
  123.         Stack pilhaArv = new Stack();
  124.         NoAB subArv = null;
  125.  
  126.         // Leia o string PostFix
  127.         for (char ch : postfix.toCharArray()) {
  128.             // Se o caracter lido for um operando
  129.             if (ch >= '0' && ch <= '9')
  130.                 // Insira este caracter na pilha
  131.                 pilhaArv.push(ch);
  132.             // Se o caracter lido for um operador
  133.             if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
  134.                 // Crie uma nova sub-árvore que terá o operador como root
  135.                 subArv = new NoAB(ch);
  136.                 // E o primeiro elemento da pilha como filho direito
  137.                 subArv.adcionaDireita(pilhaArv.pop());
  138.                 // E o segundo elemento da pilha como filho esquerdo
  139.                 subArv.adcionaEsquerda(pilhaArv.pop());
  140.  
  141.                 // Insira esta nova sub-árvore na pilha
  142.                 pilhaArv.push(subArv);
  143.             }
  144.         }
  145.  
  146.         // Imprime a árvore pelo método pós-ordem
  147.         posOrdem(subArv);
  148.     }
  149.  
  150.     public static void posOrdem(NoAB raiz) {
  151.         // condição de parada
  152.         if (raiz == null)
  153.             return;
  154.         // 1) percorrer sae
  155.         posOrdem(raiz.getEsquerda());
  156.         // 2) percorrer sad
  157.         posOrdem(raiz.getDireita());
  158.         // 3) tratar raiz
  159.         System.out.print(raiz.getDado() + ", ");
  160.  
  161.     }
  162.  
  163. }
Advertisement
Add Comment
Please, Sign In to add comment