2016-03-25 20 views
0

Giriş operatörü (+, -, *, /) olduğunda iki işleneni sayan yığını kullanarak nasıl değerlendirebilirim? örneğin giriş:
+
Çıkış:
4 + 5 = 9
Girdi:
*
Çıkış:
3 * 9 = 27
Girdi:
/
Çıkış:
27/10 = 2.7
Girdi:
-
Çıkış: 2,7-1 = 1.7
Sorunum tamsayı olarak giriş depolamak için engel oluyor ve daha sonra bu tür bir çıktı üretmek için değerlendirilmesi.
benim Stack() koduYığın Postfix Değerlendirmesi?

public class Stack { 

    int maxSize; 
    int top; 
    String array[]; 

    public Stack(int n) 
    { 
     maxSize = n; 
     array = new String[maxSize]; 
     top = 0; 
    } 

    public boolean empty() 
    { 
     if(top==0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public void push(String str) 
    { 
     if(top < maxSize) 
     { 
     array[top] = str; 
     top++; 
     } 
     else 
     { 
      System.out.println("Stack Overflow !!!"); 
     } 
    } 

    public String pop() 
    { 
     if(!this.empty()) 
     { 
      String temp = this.peek(); 
      array[top-1] = null; 
      top--; 
      return temp; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public String peek() 
    { 
     if(top > 0) 
     { 
     return array[top-1]; 
     } 
     else 
     { 
      return null; 
     } 
    } 

} 

benim ana kod

public static void main(String[] args) { 
     // Stack<Integer> stack = new Stack<Integer>(); <-- error? 
     Scanner sc = new Scanner(System.in); 
     Stack myStak = new Stack(3); 
     System.out.println("Input : "); 


     String input; 
    do{ 
     input = sc.next()+sc.nextLine(); 
     myStak.push((input)); 
     String operator = myStak.peek(); 
     switch(operator.charAt(0)) 
     { 
      case '+': 
      int a = Integer.parseInt(myStak.pop()); 
      int b = Integer.parseInt(myStak.pop()); 
      int result = a+b; 
      myStak.push(Integer.toString(result)); 
      System.out.print("Output : "); 
      System.out.print(a+" + "+b+" = "+result); 
       break; 
     } 
      // myStak.push(myStak.pop() + myStak.pop()); 
      // System.out.println("Output:"); 
      // System.out.println(myStak.pop()+"+"+myStak.pop()); 


    } 
    while(input!= "+" || input!= "-" || input!= "*" || input!= "/"); 
+0

Aklında iki noktaya dikkat etmek gerekir: Burada

7 Kodunuzun temizlemiş versiyonudur. 1) pop olduğunda artık yığın üzerinde değil, bu yüzden temp değişkeninde saklamanız gerekir. 2) İki kez pop yaparken sol taraftaki ve operatörün sağ tarafı olan aklınızda bulundurun. – ditkin

+0

Geçici bir değişkende sakladım ama "+" gibi bir operatöre girdiğimde, bana bir hata veriyor, buna neyin neden olabileceğini biliyor musunuz? @ditkin – RikiMaru

cevap

1

Kodunuzdaki birden küçük hatalar var. Alacağınız tek belirteci ve hemen bitiştirmek: - Bir debugger kullanımı ve uyarılara dikkat etmek öğrenmelidir NetBeans hemen birini ...

  • input = sc.next()+sc.nextLine();

    gerçekten bir hata ama bu yapı için neden anlayamıyorum verdi nextLine'un ne olacağını bir çizginin sonu ile - neden sadece input = sc.next();? yığın
  • istenmeyen operatörü:

    myStak.push((input)); 
        String operator = myStak.peek(); 
        switch(operator.charAt(0)) 
        { 
         case '+': 
         int a = Integer.parseInt(myStak.pop()); 
    

    Eğer Integer.parseInt(myStak.pop()) son belirteç olduğunu yürütmek iken ... bir ParseException atmak muhtemeldir operatör! Ya ...

  • diğer operatörler hala uygulanmadı ... birinci veya hatta daha iyi zorlama operatörü pop
  • asla kullanım == dizeleri veya nesneleri ama sadece equals karşılaştırmak. Bu hat:

    while(input!= "+" || input!= "-" || input!= "*" || input!= "/"); 
    

    (hem daha basit ve doğru) olması gerekir:

    while (! "+-*/".contains(input)); 
    

    bu

    derhal Netbeans tarafından tespit edildi ve herhangi bir IDE veya Java derleyici üzerinde bir uyarıda gerektiğini varsayalım.

Son olarak, yalnızca tamsayı kullandığınız için 27/10 2 değil 2 olacaktır.

public static void main(String[] args) { 
    // Stack<Integer> stack = new Stack<Integer>(); <-- error? 
    Scanner sc = new Scanner(System.in); 
    Stack myStak = new Stack(16); // I broke at 3 at first test... 
    System.out.println("Input : "); 

    String input; 
    while (true) { 
     input = sc.next(); // let the Scanner deal with spaces and newlines 
     String operator = input.substring(0, 1); 
     if ("+-/*".contains(operator)) { // is it an operator? 
      int a = Integer.decode(myStak.pop()); // yes unpack and compute 
      int b = Integer.decode(myStak.pop()); 
      int result = compute(a, b, operator); 
      myStak.push(String.valueOf(result)); // push result back to stack and display 
      System.out.println(a + " " + operator + " " + b + " = " + result); 
     } else if ("=".equals(operator)) { // stop on = 
      break; 
     } else { 
      myStak.push(input); // not an operator: assume a number and push it 
     } 
    } 
} 

// one single static function to avoid code duplication (DRY principle) 
private static int compute(int i, int j, String op) { 
    switch (op.charAt(0)) { 
     case '+': 
      return i + j; 
     case '-': 
      return i - j; 
     case '*': 
      return i * j; 
     case '/': 
      return i/j; 
    } 
    return 0; 
} 
+0

Teşekkür ederim, bana kodumda başvurmayı unuttuğum bazı temel şeyleri öğrettin. Ben "Integer.decode" hakkında bilmiyordum, bu yüzden bu konuda araştırma yapmak zorunda kalacağım. Çözümünüz çok açık, bana tekrar borç verdiğiniz için teşekkürler :) @Serge Ballesta – RikiMaru

İlgili konular