2014-11-03 5 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

Что произойдет, если первый символ не является цифрой? Он будет запрашивать верхнюю часть пустого стека. Поместите много '' '' '' '' '' '' 's' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+1

Ну, ваш знак «-» в строке 'blah', которую вы разместили, не является знаком минус. Кроме того, нельзя дублировать: http://ideone.com/xqQSmM – PaulMcKenzie

ответ

1

Как отметил PaulMcKenzie, ваш знак минус в строке blah - это своего рода странный символ юникода, который выглядит как обычный знак минус, но это не так. Так как это какой-то странный символ юникода, он фактически хранится в более чем одном байте в памяти строки, что означает, что ваш итератор for-loop повторяет больше раз, чем вы ожидали бы!

Положите cout << blah.length() << endl; сразу после объявления blah, и вы увидите, что длина больше ожидаемых 9 символов.

Кроме того, эта программа не выдаст правильный ответ, даже если проблема выше зафиксирована. Вам необходимо преобразовать ваши номера символов ascii (которые находятся в целочисленном диапазоне [48,57]) в эквивалентные значения целых чисел, прежде чем выполнять какие-либо вычисления с ними.

1

Если код, который вы отправили, является фактическим кодом, тогда возникает проблема со строкой, которую вы опубликовали.

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

Это последний символ после 3 не является ASCII знак минус. Это символ Юникода 0x2212. Измените это на минус ASCII и запустите программу.

Возможно, произошло то, что вы начали с минус ASCII, скопировали текст в другое приложение, и приложение пытается «придумать» минус, заменив его более эстетичным видом. Затем вы можете скопировать текст из этого приложения обратно в редактор исходного кода.

 Смежные вопросы

  • Нет связанных вопросов^_^