2013-01-01 3 views
5

저는 Java에 익숙하지 않고 방정식을 취하고 평가하는 계산기를 만들고 있습니다.브래킷 우선 순위 부여

저는 스캐너 방법을 사용하여 입력을 얻었지만, 이는 입력 내용이 스캐너 유형이라는 것을 의미합니다. 이 입력에 어떻게해야 평가할 수 있습니까? 그리고 평가할 수있게되면 어떻게 괄호에 우선 순위를 둘 수 있습니까?

예를 들어 방정식 (5 * (4 + 3)) * 2에 대해 프로그램을 먼저 (4 + 3) 평가 한 다음 4를 곱한 다음 모든 2.

고마워요.

+0

등호가 없으므로 등식이 아닌 문자열을 문자열로 읽고 구문 분석해야합니다. '스캐너 (Scanner) '를 사용한다고해도 텍스트 줄을 읽는 것 외에는이 과정에서 당신을 매우 멀리하지는 않습니다. –

+0

당신이 한 일은 정확하고 우선 순위는 왼쪽에서 오른쪽으로 주어집니다. 또는 ((4 + 3) * 5) * 2를 사용할 수 있습니다. 안쪽 괄호가 먼저 평가됩니다. –

+1

브래킷을 포함한 작업자를 스택에 넣습니다. – user1929959

답변

1

나는 이것이 도움이 될 것이라고 생각한다 : Polish notationReverse Polish notation. 트리에서 문자열을 분할하고 한 번에 한 단계 씩 실행하는 방법에 대한 아이디어를 설명합니다.

3

필요한 것은 Dijkstra 's Shunting Yard Algorithm입니다. 이렇게하면 고정 된 수학 표기법이 사후 수정 표기법으로 변환됩니다.이 표기법은 사후 수정 표기법이 둘 중 어느 것도 필요하지 않으므로 연산자 우선 순위 및 대괄호로 모든 문제를 깔끔하게 정렬합니다. Wikipedia 페이지에는 Java로 번역 될 수있는 C의 전체 예제가 있습니다.

1

@Simon G가 제안한 Dijkstra의 Shunting Yard 알고리즘을 사용하면 제안이 나왔습니다. 심볼을 파싱하기 위해 "마이크로 문법"을 구현해야하지만, Scanner은 95 %의 작업을 수행 할 수 있습니다.

대안은 ANTLR 또는 Javacc와 같은 파서 생성기를 사용하여 표현 파서를 구현 한 다음 평가를 트리 탐색으로 구현하는 것입니다. 그러나 표현식을 한 번만 평가하기를 원한다면 오히려 헤비급입니다.

마지막으로,이 문제는 잘 알려진 (해결 된) 문제이지만 사소한 것이 아닙니다 ... 어떤 언어로든. 그리고 아마도 이것은 지식을 완성하기 위해 알고리즘 및/또는 컴파일러에 대한 더 많은 독서를해야한다고 말할 것입니다.

+0

재귀 적 하강은 또 다른 가능성이며, 아마도 첫 번째 선택이지만, 나는 이미 그것을하는 방법을 알고 있습니다 .-) – EJP