2013-09-10 4 views
0
import java.util.*; 

public class Pemdas { 

public static double Express(String str) 
{ 
    Stack<Double> num = new Stack<Double>(); 
    Stack<String> op = new Stack<String>(); 
    String number = "[0-9]*"; // any digit from 0-9 


    for (int i = 0; i < str.length(); i++) 
    { 
     if (str.substring(i,i+1).equals(number))    
      num.push(Double.parseDouble(str.substring(i, i+1))); 

     else if (str.substring(i, i+1).equals("+"))   
      op.push(str.substring(i, i +1)); 

     System.out.println(str); 
    } 

    double n = num.pop(); 
    if (op.pop().equals("+")) 
     n = n + num.pop(); 


    return n; 
} 

public static void main(String[] args) 
{ 

    System.out.print("Enter an Expression: "); 
    String ex = StdIn.readString(); // This is where I enter my string input 
    System.out.println(Express(ex)); 

} 

} 

Предположим, что у меня есть строковая переменная «5 + 5» в качестве моего ввода. В цикле for 5 предполагается, что он будет помещен в числовой стек, но я продолжаю получать ESE, и я не понимаю, почему.Почему мои строковые переменные не помещаются в мои стопки?

ответ

3

Вы используете equals(), если хотите совместить с регулярным выражением. equals() предназначен для сравнения буквенных строк. Скорее всего, вы хотите matches():

if (str.substring(i,i+1).matches(number)) 
    num.push(Double.parseDouble(str.substring(i, i+1))); 

На самом деле, вам не нужно регулярное выражение, вообще здесь. Вы можете упростить цикл, делая что-то вроде:

for (int i = 0; i < str.length(); i++) 
{ 
    char c = str.charAt(i); 

    if (Character.isDigit(c))    
     num.push((double) (c - '0')); 

    else if (c == '+')   
     op.push("+"); 

    System.out.println(str); 
} 

Наконец, пожалуйста, следуйте соглашению об именах в Java и назвать ваш метод express() вместо Express().

+0

Учитывает ли '+' как литеральную строку, или она включена в регулярное выражение? Я пробовал то же самое с моим стеком op, но это тоже пусто. – iii

+0

@igknighton Все, что вы передаете как аргумент 'equals()', рассматривается как буквальная строка. – arshajii

+0

Хорошо, мой стек op все еще считается пустым. Это из-за пространства между 5s и +? – iii

Смежные вопросы