2013-06-22 1 views
3

확인 단항 연산자를 돌봐 너 한테 rithm를 접미사에 있습니다.중위는

입력이 이미 토큰 스트림으로 형식화되었으므로 토큰에 연산자 또는 피연산자 정보가 포함됩니다. 알고리즘은이를 받아 들여 평가할 수있는 후위 표현식을 제공해야합니다. 나는 표준 변환 너 한테을 사용하는 경우

, 나는 단항 및 이진 연산 구별하지 못할. a * (- b)가 나에게 ab- *를주는 것은 잘못된 방식으로 평가됩니다.

+4

질문은 어디에 있습니까? – kotlomoy

+0

기호에 대한 출력에서 ​​다른 기호 (예 : '_')를 단항 연산자 '-'로 사용합니다. – BLUEPIXY

+0

질문 : 표준 문제 또는 내 문제를 정렬하는 새로운 문제의 수정을 제안합니다. – Aditya

답변

7

또는 다른 운영자가, 또는이 왼쪽 괄호 다음에 오는 후, 다음은 단항 연산자입니다 온다.

출력 문자열에서 단항 연산자에 다른 기호를 사용해야합니다. 그렇지 않으면 접미사 표기법에서 이진 형식과 단항 형식을 구별 할 수 없기 때문입니다.

+0

몇 개의 연속적인 연산자가 있다면? 그 규칙은 여전히 ​​적용됩니까? 예 : '5 + -2'는 괜찮지 만'5 + - + - 2'는 어떨까요? – hfossli

+2

@htossli 네, 대단히예요. –

1

두 개의 연속적인 연산자를 사용하면 두 번째 연산자는 단항이됩니다. 연속적인 연산자가 더 많은 경우 첫 번째를 제외한 모든 연산자는 단항 연산자가됩니다.

는 피연산자 -1 조작자 *에서 모든 단항 - 변환하고, 제 1 요소는 운영자 경우 모든 단항 +

제거 그것은 단항 연산자이다.

괄호는 특별한 경우이지만 무시할 수있는 첫 번째 단계는 할 수 있습니다. 다음 예에서 -*과 연속됩니다.

4*(-(5)) 

및 토큰

가 될 것입니다 :

4 
* 
(
-1 
* 
(
5 
) 
) 
+0

결국 다른 답을 선호했는데 실제로 단항 연산자의 출력에 특수 기호가 필요했습니다.결국 그것은 변환 된 문자열을'a * (-b)'로 어떻게 보았을까요? C 표기법에 충실 했습니까? 아니면 * 기호가 내포되어있는 4 (5-2)와 같은 것을 받아들이셨습니까? – Antonio

+0

잘 다음과 같은 멤버들로 클래스를 정의했습니다 : int opcode, string operand. 입력 문자열을 먼저이 클래스의 배열로 변환 했으므로 스캔하는 동안 단항 또는 2 진 op인지 확인하고 그에 따라 opcode를 할당했습니다. 그렇다면 이것을 후위로 변환하고 단항 연산자를 처리 한 if-else conditiosn을 평가하는 동안 (나는 특정 연산자 집합을 할당 한 이후 단항 적이라는 것을 이미 알고 있습니다) – Aditya

-1

읽으 shunting yards algorithm에 대해. 운영자가 표현식에서 우선 인 경우

+1

그 링크는 검색하는 방법에 대해 아무 것도 말하지 않습니다 단항 연산자 취급하기 – hfossli

+0

단항 연산을 가장 높은 우선 순위로 취급해야합니다. – Ayman

0

단항 연산자를 완전히 제거하기 위해 -606-으로 간단하게 변환 할 수 있습니다. 저는이 방법이 더 직각적이고 처리 할 때 특별한 경우를 돌볼 필요가 없기 때문에이 방법을 좋아합니다.

대체 접근법은 동일한 기호를 사용하여 연산자의 단항 및 이진 버전에 다른 기호를 사용하는 것입니다 (예 : -은 이진 마이너스로 유지되고 ~은 부정 부호가됩니다.