2016-09-20 8 views
1

자바에서 접미사 계산기를 만들기 위해 스택을 사용하고 있습니다. 나는 몇 가지 문제를 건너오고 있지만 주요 부분을 작성했습니다. 우선, 공백을 고려해야하고, 현재 설정으로 어떻게해야하는지 잘 모르겠습니다. 그게 프로그램을 완전히 고칠 지 확신 할 수는 없지만 시작에 불과합니다. 어떤 도움이라도 대단히 감사하겠습니다. 코멘트에서 언급 한 바와 같이자바 접미사 계산기 오류

import java.util.Scanner; 
import java.util.Stack; 
public class Postfix 
{ 
public static void main(String[]args) 
{ 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Enter a Postfix expression"); 
    String input = sc.nextLine(); 
    Stack<Integer> Pstack = new Stack<Integer>(); 
    int result = 0; 
    for(int i=0; i<input.length();i++) 
    { 
     char ch = input.charAt(i); 

     if(ch>='0' && ch<='9') 
     { 
      Pstack.push((int)(ch-'0')); 
     } 
     else 
     { 
      int o1 = Pstack.pop(); 
      int o2 = Pstack.pop(); 

      switch(ch) 
      { 
      case '+':result=o1+o2; 
      break; 
      case '-':result=o1-o2; 
      break; 
      case '/':result=o1/o2; 
      break; 
      case '*':result=o1*o2; 
      } 
     } 
     Pstack.push(result); 
    } 
    result = Pstack.pop(); 
    System.out.println("result: "+ result); 
    } 
} 
+0

넣어 수정한다 :'경우 (채널 == '') 계속해서'직접 숯불 채널 = input.charAt (I)'이후;' . –

답변

2

은 공백으로 문제를 해결한다 직접

char ch = input.charAt(i); 

이 후

if(ch == ' ') continue; 

을 넣어.

또 다른 문제는

Pstack.push(result); 

마다 시간 대비해 운영자가 평가 한하지을 수행하는 것이다.

이 문장은 "else"경우의 마지막 문장이어야합니다.

또한 스택에서 인수가 팝되는 방법을 수정해야합니다.

후위 표현식 12- (-1로 평가 됨)가있는 경우 2가 스택 맨 위에 있고 1이옵니다. 현재 솔루션에서 인수가 잘못된 순서로 검색되므로 결과는 2 -1이됩니다.

그래서

int o1 = Pstack.pop(); 
int o2 = Pstack.pop(); 

int o2 = Pstack.pop(); 
int o1 = Pstack.pop(); 
+0

감사합니다! 그것은 그것을 고쳤다. 또한 좀 더 잘 이해할 수있게 도와주었습니다. 좋은 대답! –

+0

내 프로그램을 다시 살펴본 후에 하나 더 질문이 있습니다. 방금 계산기가 10 이하의 숫자에 대해서만 작동한다는 것을 깨달았습니다. 예를 들어, 1 2 + works and equals 3. 그러나 1 11 + doesnt와 2 대신 같습니다. 그 문제를 해결할 수있는 방법이 있습니까? –

+0

이 경우 인수/연산자를 구분하는 구분 기호를 추가하여 후위 문자열의 형식을 변경해야합니다. 그렇지 않으면 111-은 11 1 - 또는 11 11 -로 해석 될 수 있습니다. 그런 다음 입력 param에 대해 다른 Scanner를 사용하여 인수/연산자를 검색 할 수 있습니다. – Gernot