2012-10-03 3 views
2

과제의 경우 역 폴란드어 표기법이 적용됩니다. 이 예제에서는 다음을 사용합니다 : 2 3 8 * + $$은 표현식의 끝을 나타냅니다. 스택을 사용하여 대답을 출력합니다.연산자에 대한 cstring 검색

I가 사용되었다 :

getline(cin, input, '&'); 
input.c_str(); 

방정식 판독 후 c_string으로 우회전 그래서 상기 입력의 개별 요소로 볼 수있다.

후에 몇 가지 사항을 확인해야합니다. 요소가 숫자라면 스택에 밀어 넣어야합니다. 그것이 공백이라면 나는 그것을 뛰어 넘을 필요가있다.

if (isdigit(input[i])) 
{ 
    push(); 
    i++; 
} 
else if (isspace(input[i])) 
{ 
    i++; 
} 

지금은 무엇이 붙어 있습니다. 연산자 (이 경우 *)를 쳤을 때 스택에서 상위 두 요소를 팝하고 '연산'하여 결과를 스택에 다시 푸시해야합니다. 그러나 나는 그들이 그들이 사업자라는 것을 인식 할 수있는 어떤 것도 모르고있다. 어리석은 질문 일지 모르지만 도움을 주시면 감사하겠습니다.

+0

그냥 공백으로 입력을 보장합니까? – WhozCraig

+0

@WhozCraig Yessir, 항상 각 값 사이에 공백이 있습니다. – ViscousRandom

+0

입력 할 때 다중 숫자가 포함 된 경우 어떻게합니까? '12 321 + $'? – PiotrNycz

답변

0

약 4 ~ 5 명의 연산자 만 있습니다.

if (input[i] == '*') {...} 
+2

스위치를 사용하면 –

+0

pfft입니다. 나는 스위치와 strtok()을 사용할 것이지만, 확률은 런타임 라이브러리가 할당을 위해 다소 제한적이다. 그런 다음 다시 isdigit(), isspace() 등을 봅니다. – WhozCraig

0

글쎄, "기본 제공"방법이 없습니다. 나는 IsOperator (char ch) 함수를 작성한다. 그리고 다음과 같은 작업을 수행합니다 '==', 당신은 미리 들여다해야하기 때문에 조금 더 복잡해진다하지만 아이디어는 동일 같은

int IsOperator(char ch) 
{ 
    // either add more operators or use a table, etc. here 
    if (ch == '+' || ch == '-' || ch == '/' || ch == '*') 
     return 1; 

    return 0; 
} 

당신은 멀티 문자 사업자가있는 경우.

1

당신은 기능 map을 작성하고 사업자

std::map<char, void (*)(char *)> operators; 

operators['*'] = &mult; 
operators['+'] = &add; 
... 

일치하고 conditionnal 문

if (isdigit(input[i])) 
    { 
     push(); 
     i++; 
    } 
else if (isspace(input[i])) 
    { 
     i++; 
    } 
else if (operators.find(input[i]) != operators.end()) 
    { 
     operators[input[i]](input); 
    } 

이 방법으로, 당신은 쉽게 계산기에 새 운영자를 추가 할 수 있습니다.

0

역 폴란드어 표기법 계산기를 작성하는 경우 스택에 숫자 나 숫자 만 예를 들어 있습니다. BTW 여러 자리 숫자를 허용하지 않습니까?

코드 :

numbers,push(c - '0'); 
  • - 스택에 바로 넣을 수

    • 당신은 자리 문자 c 있습니다

      은 모두 만 std::stack<int> numbers;해야 할 두 가지 사례를 고려 당신은 연산자가 있습니다, '+'라고 말하면, 합계로 상위 두 숫자를 대체합니다 :

    코드 :

코드 :

if (numbers.size() != 1) { 
    throw std::runtime_error("There should be only one!"); 
    } 
    int result = numbers.top(); 
    numbers.pop(); 

if (numbers.size() < 2) { 
    throw std::runtime_error("Too little numbers for +"); 
} 
int a = numbers.top(); 
numbers.pop(); 
numbers.top() += a; 
당신은 '$'를 가지고 스택에 하나의 번호가 있는지 확인
  • , 그것은 결과입니다