Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.60 KB | None | 0 0
  1. import java.util.LinkedList;
  2.  
  3. public class Pila<E> extends LinkedList<E> {
  4.  
  5. public void empujar(E e ){
  6. super.addFirst(e);
  7. }
  8.  
  9. public E remover(){
  10. return super.removeFirst();
  11. }
  12.  
  13. public boolean estaVacia(){
  14. return super.size() == 0;
  15. }
  16.  
  17. public String toString(){
  18. return super.toString();
  19. }
  20. }
  21.  
  22.  
  23. //representa una expresion matematica x + y * z etc..
  24. public class ExpresionMatematica{
  25. private String expresion;
  26. private char[] exprArr;
  27. private int posActual = 0;
  28.  
  29. public ExpresionMatematica(String expr){
  30. expresion = expr;
  31. exprArr = expr.toCharArray();
  32. }
  33.  
  34. //retornar siguiente elemento como int y no como char
  35. public int getElementoComoNum(){
  36. return Integer.parseInt(String.valueOf(getElemento()));
  37. }
  38.  
  39. //revisar si el elemento siguiente es un nro
  40. public boolean elementoEsNum(){
  41. return Character.isDigit(exprArr[posActual]);
  42. }
  43.  
  44. //revisa si el elemento siguiente es un operador
  45. public boolean elementoEsOp(){
  46. char ele = exprArr[posActual];
  47. return ele == '+' || ele == '-' || ele == '*' || ele == '/';
  48. }
  49.  
  50. //determina si estamos al final de la expresion
  51. public boolean noAlFinalDeExpr(){
  52. return posActual != exprArr.length;
  53. }
  54.  
  55. //regresar el elemento siguiente y aumentar posActual
  56. public char getElemento(){
  57. return exprArr[posActual++];
  58. }
  59.  
  60. public String toString(){
  61. return expresion;
  62. }
  63. }
  64.  
  65.  
  66. //clase que calcula el valor de una expresion matematica
  67. public class CalcExprMatematica {
  68.  
  69. private Pila<Integer> operandos;
  70. private Pila<Character> operadores;
  71. private ExpresionMatematica expr;
  72.  
  73. public CalcExprMatematica(String exp){
  74.  
  75. operandos = new Pila<>();
  76. operadores = new Pila<>();
  77. expr = new ExpresionMatematica(exp);
  78. }
  79.  
  80. public String toString(){
  81. return expr +" = " + calcular();
  82. }
  83.  
  84. //calcular el valor de la expresion
  85. int calcular(){
  86. while(expr.noAlFinalDeExpr()){
  87. if(expr.elementoEsOp()){
  88. char op = expr.getElemento();
  89. if(operadores.estaVacia()){operadores.empujar(op);}
  90. else{
  91. char opRemovido = operadores.remover();
  92. if(calcularPrecedenciaDeOp(op) > calcularPrecedenciaDeOp(opRemovido)){
  93. operadores.empujar(opRemovido);
  94. }else{
  95. aplicarOperation(opRemovido);
  96. }
  97. operadores.empujar(op);
  98. }
  99. /*si el caracter siguiente es un nro se hace lo siguiente :
  100. apendar nros como string despues convertirlos int ejemplo : 20 + 4.
  101. 2 es numero, 0 es numero apendamos los nros 20. y lo empujamos a la pila
  102. */
  103. }else if(expr.elementoEsNum()){
  104. StringBuilder numeros = new StringBuilder();
  105. while(expr.noAlFinalDeExpr() && expr.elementoEsNum()){
  106. numeros.append(expr.getElementoComoNum());
  107. }
  108. operandos.empujar(Integer.parseInt(numeros.toString()));
  109. }
  110. }
  111. // si al final ahy operadores hay que aplicarlos hasta que no haigan mas
  112. while(!operadores.estaVacia()){
  113. aplicarOperation(operadores.remover());
  114. }
  115. return operandos.remover();
  116. }
  117.  
  118. private int calcularPrecedenciaDeOp(char op){
  119. return op == '+' || op == '-'? 1 : 2;
  120. }
  121.  
  122. private void aplicarOperation(char op){
  123. if(operandos.estaVacia()) throw new RuntimeException("SE operandos vacia");
  124. int y = operandos.remover();
  125. if(operandos.estaVacia()) throw new RuntimeException("SE operandos vacia");
  126. int x = operandos.remover();
  127. int z;
  128.  
  129. if (op == '*') { z = x * y; }
  130. else if(op == '/'){
  131. if (y != 0) {
  132. z = x/y;
  133. }
  134. throw new ArithmeticException("division por 0");
  135. }
  136. else if (op == '+') { z = x + y; }
  137. else if (op == '+') { z = x - y; }
  138. else throw new RuntimeException("syntax error no es operador valido");
  139. operandos.empujar(z);
  140. }
  141. }
  142.  
  143. public class CalculadorDeExprDemo {
  144. public static void main(String[] args)throws IOException {
  145. String expresion = JOptionPane.showInputDialog("ingrese expresion");
  146. CalcExprMatematica cal = new CalcExprMatematica(expresion);
  147. System.out.println(cal);
  148. }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement