2013-08-16 4 views
2

Я применил алгоритм, который я нашел на this link, для вычисления арифметического выражения для j2me. Но он отлично работает только тогда, когда у меня есть одинарные цифровые операнды, т. Е. 2, 5, 7, 3, но не для 456, 56, 34,45 и т. Д. Я сделал некоторые изменения, поскольку я знал, что должен был добавить числа, найденные не один за другим, закончите цифрой. Затем я нашел this link, но все же все прошло хорошо, как ожидалось. Сначала я попробовал библиотеку exp4j, но я думаю, что это не работает на j2me. Код стал очень грязным прямо сейчас. Могу ли я получить какие-либо мнения о том, как мне решить эту проблему? Любая помощь по этому поводу будет оценена по достоинству.Оценка арифметических выражений в j2me: работает только для одноразрядных операндов

код, который изначально работал только для одиночных разрядов операндов:

import java.util.Stack; 
import java.util.Vector; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class SampleInfixToPostfixToResult { 

static Stack stack=new Stack(); 
static StringBuffer p=new StringBuffer(); 
static Vector v=new Vector(); 

public static StringBuffer toPostfix(String q) 
{ 
for(int i=0;i<q.length();i++) 
{ 
    if(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9') 
    { 
     p.append(q.charAt(i)); 
    } 
    else if(q.charAt(i)=='(') 
    { 
     stack.push(q.charAt(i)); 
    } 
    else if(q.charAt(i)==')') 
    { 
     for(int j=0;!stack.empty()&&!stack.peek().equals('(');j++) 
     { 
      p.append(stack.pop()); 
     } 
     stack.pop(); 
    } 
    else if(q.charAt(i)=='+'||q.charAt(i)=='-'||q.charAt(i)=='/'||q.charAt(i)=='*') 
    { 
     if(stack.empty()||stack.peek().equals('(')) 
      stack.push(q.charAt(i)); 
     else 
     { 
      while(!stack.empty()&&!stack.peek().equals('(')&&isHigh(q.charAt(i), stack.peek())) 
      { 
       p.append(stack.pop()); 
      } 
      stack.push(q.charAt(i)); 
     } 
    } 
} 
while(!stack.empty()) 
{ 
    p.append(stack.pop()); 
} 
System.out.println(p); 
return p; 
} 


public static boolean isHigh(char op, Object AtStack) 
{ 
char opAtStack=AtStack.toString().charAt(0); 
boolean isHigh=false; 
if((op==opAtStack)) 
    isHigh=true; 
if((op=='+'||op=='-')&&(opAtStack=='/'||opAtStack=='*')) 
{ 
    isHigh=true; 
} 
if((op=='+'&&opAtStack=='-')||(op=='-'&&opAtStack=='+')||(op=='/'&&opAtStack=='*')||(op=='*'&&opAtStack=='/')) 
{ 
    isHigh=true; 
} 
    return isHigh; 
} 

public static double result(StringBuffer p) 
{ 

for(int i=0;i<p.length();i++) 
{ 
    System.out.println(p.charAt(i)); 
    if(p.charAt(i)=='0'||p.charAt(i)=='1'||p.charAt(i)=='2'||p.charAt(i)=='3'||p.charAt(i)=='4'||p.charAt(i)=='5'||p.charAt(i)=='6'||p.charAt(i)=='7'||p.charAt(i)=='8'||p.charAt(i)=='9') 
    { 
     stack.push(p.charAt(i)); 
    } 
    if(p.charAt(i)=='+'||p.charAt(i)=='-'||p.charAt(i)=='/'||p.charAt(i)=='*') 
    { 
     double a=Double.parseDouble(stack.pop().toString()); 
     double b=Double.parseDouble(stack.pop().toString()); 
     if(p.charAt(i)=='+') 
     { 
      stack.push(b+a); 
     } 
     else if(p.charAt(i)=='-') 
     { 
      stack.push(b-a); 
     } 
     else if(p.charAt(i)=='/') 
     { 
      stack.push(b/a); 
     } 
     else if(p.charAt(i)=='*') 
     { 
      stack.push(b*a); 
     } 
    } 
} 
System.out.println(stack); 
return 0; 
} 

public static void main(String[] args) { 
    // TODO code application logic here 
    String s=new String("65*(76+2)-0/4+(2*5-6*(2*5))"); 


    SampleInfixToPostfixToResult.result(SampleInfixToPostfixToResult.toPostfix(s)); 
    System.out.println(66*(76+2)-0/4+(2*5-6*(2*5))); 
} 
} 

Обновленного код, который я работал для оценки многоразрядного операнда (действительно перепутались)

import java.util.Stack; 
import java.util.Vector; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class SampleInfixToPostfixToResult { 

static Stack stack=new Stack(); 
static StringBuffer p=new StringBuffer(); 
static Vector v=new Vector(); 

public static Vector toPostfix(String q) 
{ 
for(int i=0;i<q.length();i++) 
{ 
    if(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9') 
    { 
     StringBuffer tn=new StringBuffer(); 
     while(i<q.length()&&(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9')) 
     { 
      tn.append(q.charAt(i++)); 
     } 

     v.add(tn); 

    } 
    else if(q.charAt(i)=='(') 
    { 
     stack.push(q.charAt(i)); 
    } 
    else if(q.charAt(i)==')') 
    { 
     for(int j=0;!stack.empty()&&!stack.peek().equals('(');j++) 
     { 
      v.add(stack.pop()); 
     } 
     stack.pop(); 
    } 
    else if(q.charAt(i)=='+'||q.charAt(i)=='-'||q.charAt(i)=='/'||q.charAt(i)=='*') 
    { 
     if(stack.empty()||stack.peek().equals('(')) 
      stack.push(q.charAt(i)); 
     else 
     { 
      while(!stack.empty()&&!stack.peek().equals('(')&&isHigh(q.charAt(i), stack.peek())) 
      { 
       v.add(stack.pop()); 
      } 
      stack.push(q.charAt(i)); 
     } 
    } 
} 
while(!stack.empty()) 
{ 
    v.add(stack.pop()); 
} 

return v; 
} 

public static boolean isHigh(char op, Object AtStack) 
{ 
char opAtStack=AtStack.toString().charAt(0); 
boolean isHigh=false; 
if((op==opAtStack)) 
    isHigh=true; 
if((op=='+'||op=='-')&&(opAtStack=='/'||opAtStack=='*')) 
{ 
    isHigh=true; 
} 
if((op=='+'&&opAtStack=='-')||(op=='-'&&opAtStack=='+')||(op=='/'&&opAtStack=='*')||(op=='*'&&opAtStack=='/')) 
{ 
    isHigh=true; 
} 
    return isHigh; 
} 

public static double result(Vector p) 
{ 

for(int i=0;i<p.size();i++) 
{ 
    System.out.println(p.get(i)); 
    if(p.get(i)=="0"||p.get(i)=="1"||p.get(i)=="2"||p.get(i)=="3"||p.get(i)=="4"||p.get(i)=="5"||p.get(i)=="6"||p.get(i)=="7"||p.get(i)=="8"||p.get(i)=="9") 
    { 
     StringBuffer tn=new StringBuffer(); 
     while(i<p.size()&&(p.get(i)=="0"||p.get(i)=="1"||p.get(i)=="2"||p.get(i)=="3"||p.get(i)=="4"||p.get(i)=="5"||p.get(i)=="6"||p.get(i)=="7"||p.get(i)=="8"||p.get(i)=="9")) 
     { 
      tn.append(p.get(i++)); 
     } 
     System.out.println("This is the full number :"+tn); 
     stack.push(tn); 
    } 
    if(p.get(i)=="+"||p.get(i)=="-"||p.get(i)=="/"||p.get(i)=="*") 
    { 
     double a=Double.parseDouble(stack.pop().toString()); 
     double b=Double.parseDouble(stack.pop().toString()); 
     if(p.get(i)=="+") 
     { 
      stack.push(b+a); 
     } 
     else if(p.get(i)=="-") 
     { 
      stack.push(b-a); 
     } 
     else if(p.get(i)=="/") 
     { 
      stack.push(b/a); 
     } 
     else if(p.get(i)=="*") 
     { 
      stack.push(b*a); 
     } 
    } 
} 
System.out.println("Final value: "+stack); 
return 0; 
} 

public static void main(String[] args) { 
    // TODO code application logic here 
    String s=new String("65*(79+22)-0/4+(29*5-6*(2*5))"); 

    SampleInfixToPostfixToResult.result(SampleInfixToPostfixToResult.toPostfix(s)); 
    //System.out.println(65*(79+22)-0/4+(29*5-6*(2*5))); 
} 
} 
+0

Вы не могли бы найти [ 'Символ # isDigit'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isDigit(char)) полезно, а также 'Set # contains' для ваших операторов. – chrylis

+0

очень вдумчивый, спасибо. –

ответ

1

Решения:

1.Function toPostfix() теперь возвращает стек вместо вектора, так как теперь в стек добавляется постфиксное выражение, например [34,57. +] И т. Д.

2.Edited код для хранения всех цифр в стеке путем обхода строки, пока мы имеем ряд (см. Код до строки не 29)

import java.util.Stack; 
import java.util.Vector; 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

/** 
* 
* @author Sandeep 
*/ 
public class Main { 
    static Stack stack=new Stack(); 
    static Stack stackT=new Stack(); 
    //static Vector v=new Vector(); 
    //static StringBuffer p=new StringBuffer(); 

    public static Stack toPostfix(String q) 
{ 

    for(int i=0;i<q.length();i++) 
    { 
     if(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9') 
     { 
      StringBuffer p=new StringBuffer(); 
      while(q.charAt(i)=='0'||q.charAt(i)=='1'||q.charAt(i)=='2'||q.charAt(i)=='3'||q.charAt(i)=='4'||q.charAt(i)=='5'||q.charAt(i)=='6'||q.charAt(i)=='7'||q.charAt(i)=='8'||q.charAt(i)=='9') 
        p.append(q.charAt(i++)); 
      stackT.push(p); 
      i--; 
     } 
     else if(q.charAt(i)=='(') 
     { 
      stack.push(q.charAt(i)); 
     } 
     else if(q.charAt(i)==')') 
     { 
      for(int j=0;!stack.empty()&&!stack.peek().equals('(');j++) 
      { 
       stackT.push(stack.pop().toString()); 
      } 
      stack.pop(); 
     } 
     else if(q.charAt(i)=='+'||q.charAt(i)=='-'||q.charAt(i)=='/'||q.charAt(i)=='*') 
     { 
      if(stack.empty()||stack.peek().equals('(')) 
       stack.push(q.charAt(i)); 
      else 
      { 
       while(!stack.empty()&&!stack.peek().equals('(')&&isHigh(q.charAt(i), stack.peek())) 
       { 
        stackT.push(stack.pop().toString()); 
       } 
       stack.push(q.charAt(i)); 
      } 
     } 
    } 
    while(!stack.empty()) 
    { 
     stackT.push(stack.pop().toString()); 
    } 

     System.out.println(stackT); 
    return stackT; 
} 

//problem lies here 
public static boolean isHigh(char op, Object AtStack) 
{ 
    char opAtStack=AtStack.toString().charAt(0); 
    boolean isHigh=false; 
    if((op==opAtStack)) 
     isHigh=true; 
    if((op=='+'||op=='-')&&(opAtStack=='/'||opAtStack=='*')) 
    { 
     isHigh=true; 
    } 
    if((op=='+'&&opAtStack=='-')||(op=='-'&&opAtStack=='+')||(op=='/'&&opAtStack=='*')||(op=='*'&&opAtStack=='/')) 
    { 
     isHigh=true; 
    } 
     return isHigh; 
} 

public static double result(Stack p) 
{ 

    for(int i=0;i<p.size();i++) 
    { 
     if(p.get(i).toString().startsWith("0")||p.get(i).toString().startsWith("1")||p.get(i).toString().startsWith("2")||p.get(i).toString().startsWith("3")||p.get(i).toString().startsWith("4")||p.get(i).toString().startsWith("5")||p.get(i).toString().startsWith("6")||p.get(i).toString().startsWith("7")||p.get(i).toString().startsWith("8")||p.get(i).toString().startsWith("9")) 
     { 
      stack.push(p.get(i)); 
     } 
     if(p.get(i).toString().equals("+")||p.get(i).toString().equals("-")||p.get(i).toString().equals("/")||p.get(i).toString().equals("*")) 
     { 
      double a=Double.parseDouble(stack.pop().toString()); 
      double b=Double.parseDouble(stack.pop().toString()); 
      if(p.get(i).equals("+")) 
      { 
       stack.push(b+a); 
      } 
      else if(p.get(i).equals("-")) 
      { 
       stack.push(b-a); 
      } 
      else if(p.get(i).equals("/")) 
      { 
       stack.push(b/a); 
      } 
      else if(p.get(i).equals("*")) 
      { 
       stack.push(b*a); 
      } 
     } 
    } 
    System.out.println(stack); 
    return 0; 
} 

public static void main(String[] args) { 
     // TODO code application logic here 
     String s=new String("159*(79+23)-10/4+(22*54-67*(25*58))"); 
     Main.result(Main.toPostfix(s)); 
     System.out.println(159*(79+23)-10/4+(22*54-67*(25*58))); 
    } 
} 
+1

Не могли бы вы включить только * соответствующие * части кода? И, возможно, описать это, а не просто дать нам код? –