2016-08-27 7 views
0

中括弧を使って数式展開を評価するプログラムを書く必要があります。入力の最初の行は評価する式の数です。問題は、入力の最初の行が合計式の数を作る方法を知らないことです。また、入力は(2*(3+5))である必要がありますが、コードは(" 2 * (3 + 5)")しか受け付けません。私はすでにスペースを削除するためにreplaceAll()を使用していますが、正しい実行は誤りです。スペイン語のコメントは間違いです。スタック配列の中置操作

​​

Output that I want 29 21

import java.util.Stack; 
import java.util.Scanner; 

public class Stacks 
{ 
    public static int evaluarop(String string) 
    { 
     //Pasar el string a un arreglo de Char; 
     // index nombre del arreglo de Chars para saber en que char va. 
     char[] index = string.toCharArray(); 

     // Crea un Stack 'numero' de tipo Integer con la clase Stack<E> 
     Stack<Integer> numero = new Stack<Integer>(); 

     // Crea un Stack 'simbolo' de tipo Character con la clase Stack<E> 
     Stack<Character> simbolo = new Stack<Character>(); 

     //For inicia el bucle 
     for (int i = 0; i < index.length; i++) 
     { 
      // Index = char actual 
      // Index en la posición actual es un espacio en blanco, pasar al siguiente char. 
      if (index[i] == ' ') 
       continue; 

      // Si el index actual es un numero ponerlo en el stack de numero. 
      // Si el index es un char del 0 al 9 
      if (index[i] >= '0' && index[i] <= '9') 
      { 
       // If pregunta si el index es un char del 0 al 9 
       // StringBuffer() = construye un string de almacenamiento sin caracteres 
       // y con capacidad inicial de 16 caracteres 
       StringBuffer sbuf = new StringBuffer(); 
       // Si es un numero formado por mas de un digito. 
       while (i < index.length && index[i] >= '0' && index[i] <= '9') 
        sbuf.append(index[i++]); 
       // Inserta en el Stack de numeros. 
       // ParseInt pasa el String y lo retorna como un entero. 
       numero.push(Integer.parseInt(sbuf.toString())); 
      } 

      // Si el index acutal es '(', hacer push a stack simbolo. 
      else if (index[i] == '(') 
       simbolo.push(index[i]); 

      // Si el index actual es ')' prepara para hacer la operacion. 
      else if (index[i] == ')') 
      { 
       // While peek para ver el simbolo actual hasta que no sea un (. 
       while (simbolo.peek() != '(') 
       // Hace el push al resultado de la operacion. 
       // operandop() hace la operacion correspondiente al char de simbolo correspondiente. 
       // Numero.pop() agarra el numero para operar. 
        numero.push(operando(simbolo.pop(), numero.pop(), numero.pop())); 
       // Quita del arreglo el simbolo ya utilizado. 
       simbolo.pop(); 
      } 

      // Si el index actual es un simbolo de operación. 
      else if (index[i] == '+' || index[i] == '-' || index[i] == '*' || index[i] == '/') 
      { 
       // While si el char hasta arriba del Stack simbolo tiene la misma o mayor 
       // jerarquia de operaciones que el char de simbolo. 
       // Aplica el operador en la cima del Stack simbolo 
       // Mientras que el Stack de simbolo no esta vacio hace lo anterior. 
       while (!simbolo.empty() && prioridad(index[i], simbolo.peek())) 
        numero.push(operando(simbolo.pop(), numero.pop(), numero.pop())); 

       // Hace Push al char actual del Stack simbolo 
       simbolo.push(index[i]); 
      } 
     } 

     while (!simbolo.empty()) 
      numero.push(operando(simbolo.pop(), numero.pop(), numero.pop())); 
     // Stack numero contiene el resultado, hace pop() para regresarlo. 
     return numero.pop(); 
    } 

    // Si la operacion2 es de mayor importancia que operacion1; regresa true 
    public static boolean prioridad(char operacion1, char operacion2) 
    { 
     if (operacion2 == '(' || operacion2 == ')') 
      return false; 
     if ((operacion1 == '*' || operacion1 == '/') && (operacion2 == '+' || operacion2 == '-')) 
      return false; 
     else 
      return true; 
    } 

    // Aplica la operación correspondiente mediante un switch con el caracter de simbolo. 
    // Regresa el resultado. 
    public static int operando(char operacion, int num1, int num2) 
    { 
     switch (operacion) 
     { 
      case '+': 
      return num1 + num2; 
      case '-': 
      return num1 - num2; 
      case '*': 
      return num1 * num2; 
      case '/': 
      return num1/num2; 
     } 
     return 0; 
    } 

    // Main probador 
    public static void main(String[] args) 
    { 
     System.out.println("Operaciones con stacks."); 
     Scanner sc = new Scanner(System.in); 
     //int totalop = sc.nextInt(); 
     //for(int i = 0; i < totalop;i++) 
     //{ 
     System.out.println("Op: "); 
     //String string = sc.nextLine(); 
     //System.out.println(Stacks.evaluarop(string)); 
     System.out.println(Stacks.evaluarop("10+2*6")); 
     System.out.println(Stacks.evaluarop("10 + 2 * 6")); 
    } 
} 

答えて

0

私は私があなたの問題を発見したと思います。

オンライン(最初のインポートが1行目にある場合)では、番号ではない別の文字が見つかるまで、見つかったすべての番号を読み取ります。

カウンターiをインクリメントすると、検討中の文字の位置が表示されます。ループの後に、次の文字が表示されます(最初の10文字すべてを読み、最初は+記号です)。あなたはそれを調べることができます前に、テスト。

しかし、あなたは再び私をインクリメントしようとしていると、再びループの外側を通過する必要があります。

はこれを理解するために、追加

System.out.println("Examining char "+i+" :"+index[i]); 

オンライン18(https://ideone.com/NxyECcすでにコンパイルされ、作業の事について)

それはあなたの次の出力与える:あなたが見ることができるように、2つは、その後の私は(++ので、最初のケースでは、それは操作のどれを検討していないされていない

Operaciones con stacks. 
Op: 
Examining char 0 :1 
Examining char 3 :2 
Examining char 5 :6 
6 
Examining char 0 :1 
Examining char 3 :+ 
Examining char 4 : 
Examining char 5 :2 
Examining char 7 :* 
Examining char 8 : 
Examining char 9 :6 
22 

をしばらくのうちのものとforのもの)はあなたを失います。

シンプルなのは、32行目のあとに(理想的なリンクでは、コメントをつけて、それをフォークしてコメントを外すだけで)すべて動作するようになります。

+0

ここでコードは正しく動作しますが、別の質問があります。最初の入力で、必要な数式の総数をどのように管理できますか?私は最初の入力の大きさの配列を作成してその式を格納しますか?そして、どのように私はそれぞれの表現を得るのですか? – Isragca

+0

あなたのメインは正しかったですね。最初の数字を読んでから、ループごとに次の行を読んでforループを実行して、List of Stringの中に入れるか、あなたがそれを必要としない場合は、文字列を格納します。 – bracco23