문제에 OCAC 여름 두 번째 게임 타이틀 L 간단한 계산기 솔루션

간단한 계산기
[제목] 설명
* / 음이 아닌 정수의 산출 식의 산출 값의 발현 - 판독 만 +,를 포함한다.
[입력 포맷
입력 문자열은 정수 및 운영자 사이의 공간에 의해 분리 된 라인 이상 1,000 문자를 포함한다. 불법 표현하지 않습니다.
[] 출력 포맷
개의 소수점에 대응하는 문자열의 식의 출력 치.
샘플 입력 [1]
1 + 2
[출력] 샘플 1
3.00
[Enter] 키 샘플 2
4 + 2 * 5--7 / 11
[출력] 샘플 2
13.36
[설명] 샘플
1 2 = 3 +
4 + 2 * 5 - 7/11 ≈ 13.36
[TITLE] 분석
우리는도 문제를 해결하기 위해 스택을 사용할 수있다.
우선, 우리를 위해,이 질문은 비교적 간단하다, 괄호를 사용하지 마십시오.
만남의 괄호의 경우, 우리는 "첫째 추구 괄호 안의 작은 괄호"을의 효과를 달성하기 위해 재귀를 사용할 수 있습니다.
이없고, 그래서 우리는 단지 그것의 "수학"을 처리해야하기 때문에 그러나,
그것을 찾을 수 있습니다, "빼기"클래스는, "곱셈과 나눗셈"클래스입니다.
우리가 할 수있는 :
우리는 두 스택여 stack2 디지털 stack1를 저장하기위한 2 stack1 의해 분할을 2로 나눈 stack2 부호 (+ 또는 -) 저장,
우선, 화학식, stack1 제 번호에 배치
한 다음 때마다 우리는 아래 기호와 C의 숫자 처리,
C는 곱셈이나 나눗셈 기호 인 경우, 우리는 정상 소자 B의 stack1를 제거해야하고 그 결과는 스택의 A * B 또는 A / B가 배치 될 수있다.
C는 + 또는 - 부호 인 경우, 우리는,이 경우 요소의 판단 stack1 번호를 확인해야
stack1는 하나의 요소 인 경우 그 다음 우리가 stack1을 둘 것이다,는 C stack2로 인해 올 들어 넣어 그의 다음 단계는 곱셈과 나눗셈 연산 될 가능성이고,
그들은 여전히 스택 다음 작업의 정상의 북쪽에 숙박이 시간에해야합니다.
부호가 플러스 또는 마이너스 기호가있을 때 stack1 한 번에 두 가지 요소가 있다면, 그게 내가 믹스에 시작의 일부를 추가 할 새로운 오전, 말을하는 것입니다, 그의 궁극적 인 목표는이 두 가지 요소 앞에 stack1하는 것입니다 덧셈과 뺄셈.
그리고 우리가 처음 stack1 두 가지 요소가 먼저 병합 할 수 있습니다, 우리는 가정
stack1 시작은 (NUM1 스택은 "첫째, 아웃 지속"되어 후방으로이 요소의 표현이다) NUM1 나왔다
stack1로부터 나왔다는 (NUM2이 전방 요소의 표현이다) NUM2이다
및 stack2 요소는 제거 된 후, C,
C가 +이면, 우리 것 NUM2 + NUM1 뒤로 stack1에서,
C하다면 예 - 우리는 NUM2-NUM1을합니다 다시 stack1으로.
우리는 같은 방법으로 전체 표현을 통과 할 수 있었다.
이 시점에서이 요소 stack1 일 수도 있고, 또한 두 가지 요소가 있다는 것을있을 수 있습니다
우리가 넣어하지 않기 때문에 다음 두 가지 요소의 존재, 우리는 알 수 있습니다,이 두 가지 요소가 덧셈과 뺄셈, 곱셈과 나눗셈 번호이어야합니다 stack2 만 마이너스 기호 stack2에 위치. 그래서 우리는 A A에 stack1 요소가 될 수 위의 과정을 볼 필요가있다.
이어서 그 결과,이 소자에 남아 stack1 단 한사람이다.
참고 :이 질문은주의해야 할 장소를 가지고 그가 입력이 끝난 경우에도 별도의 줄 끝에 0 점이다.
다음 코드는 다음과 같습니다

#INCLUDE <. 비트 / STDC H는 ++> 
네임 스페이스를 사용하여 STD, 

스택 <더블> STK1, STK2; 
심볼들을 저장하기위한 STK2 디지털 STK1를 저장 // 
심볼 내부 STK2 보낸 // 만 + 수 또는 수 - 그것은 -1로 표시 + 1로 표시 - 

더블 a 및 
숯 C] 
문자열 선, S, 

INT의 main () { 

    while 회 stk1.pop () (! stk1.empty ()) 
    그동안 (! stk2.empty ()) () stk2.pop] 
    의 getline (CIN, 광고) 
    이제 stringstream의 SS (라인) 
    SS >> a 및 
    stk1.push (A) 
    그동안 (S SS >> A) { 
        C에서의 = S [0] 
        더블 B, 
        스위치 (C) { 
            케이스 '*': 
                B = stk1.top (); 
                stk1.pop (); 
                stk1.push (A * B의);
                단절; 
            경우에 '/': 
                B = stk1.top (); 
                stk1.pop (); 
                stk1.push (b / a); 
                단절; 
            기본값 : 
                경우 (stk1.size () == 2) {//其实是==行2就
                    더블 NUM1 = stk1.top (); 
                    stk1.pop (); 
                    이중 NUM2 stk1.top = (); 
                    stk1.pop (); 
                    더블 플래그 = stk2.top (); 
                    stk2.pop (); 
                    stk1.push (NUM2 + 플래그의 NUM1 *); 
                } 
                stk1.push (a); 
                stk2.push (c == '+'1 : -1);
                단절; 
        } 
    }
    경우 (stk1.size () == 2) { 
        이중 NUM1 stk1.top = (); 
        stk1.pop (); 
        이중 NUM2 stk1.top = (); 
        stk1.pop (); 
        더블 플래그 = stk2.top (); 
        stk2.pop (); 
        stk1.push (NUM2 + 플래그의 NUM1 *); 
    } 
    이중 입술 stk1.top = (); 
    의 printf ( "% 2LF \ 없음."입술); 
    0을 반환; 
}

 

추천

출처www.cnblogs.com/ocac/p/11131682.html