2014-11-03 2 views
0
#include <iostream> 
#include <stack> 
#include <string> 

using namespace std; 

int main() 
{ 
    string blah("512+4*+3−"); 
    stack<int> astack; 
    int a=0; 
    int b=0; 
    int result=0; 
    int final=0; 
    for (string::iterator count=blah.begin(); count != blah.end(); count=count+1) 
    { 
     if (isdigit(*count)) 
     { 
      astack.push(*count); 
      cout<<" "<<*count<<" "; 
     } 
     else 
     { 
      a=astack.top(); 
      astack.pop(); 
      b=astack.top(); 
      astack.pop(); 
      if(*count=='+') 
      { 
       result = a+ b; 
      } 
      else if (*count=='-') 
      { 
       result=a-b; 
      } 
      else if(*count=='*') 
      { 
       result=a*b; 
      } 
      astack.push(result);  
     } 
    }  
    final=astack.top(); 
    cout<<final; 
} 

내 문제는 코드를 실행할 때마다 오류가 발생하는 것입니다. 내가 연산자를 사용하여 실행 해 보았을 때 스택에 두 개의 값이 표시되는 것처럼 보였습니다. 이유는 확실하지 않습니다.스택과 반복자가있는 접미사 계산기 작성

+0

디버거에서 오류의 원인으로보고 된 라인을 알려주시겠습니까? –

+0

첫 번째 문자가 숫자가 아닌 경우 어떻게됩니까? 빈 스택의 맨 위를 질의합니다. 이러한 가정을 확인하기 위해'assert'를 많이 사용하면 오류가 발생할 수 있습니다. –

+1

글쎄, 당신이 올렸던'blah' 문자열의 "-"표시는 빼기 부호가 아닙니다. 또한, 복제 할 수 없습니다 : http://ideone.com/xqQSmM – PaulMcKenzie

답변

1

PaulMcKenzie가 지적했듯이 blah 문자열의 빼기 부호는 이상하게 보이는 유니 코드 문자입니다. 정상적인 마이너스 기호와 같지만 그렇지 않습니다. 이상한 유니 코드 문자이기 때문에 실제로 문자열의 메모리에 1 바이트 이상 저장됩니다. 반복자 for-loop는 예상보다 반복 횟수가 많습니다.

blah을 선언하자마자 cout << blah.length() << endl;을 넣으면 길이가 예상 한 9자를 초과한다는 것을 알 수 있습니다.

위의 문제가 해결 된 경우에도이 프로그램은 정답을 출력하지 않습니다. 어떤 계산을하기 전에 ASCII 숫자 문자 (정수 범위 [48,57]에있는)를 등가 정수 값으로 변환해야합니다.

1

게시 한 코드가 실제 코드 인 경우 게시 한 문자열에 문제가 있습니다. 3 후 마지막 문자가 마이너스 기호의 ASCII 아니라고

string blah("512+4*+3−"); 

. 유니 코드 문자 0x2212입니다. 이것을 ASCII 마이너스로 변경하고 프로그램을 다시 실행하십시오.

ASCII 마이너스에서 시작하여 다른 응용 프로그램에 텍스트를 복사하고 응용 프로그램에서 더 미학적으로 보이는 문자로 바꾸어 "공상"하려고 시도했을 수 있습니다. 그런 다음이 응용 프로그램의 텍스트를 소스 코드 편집기로 다시 복사했을 수 있습니다.