Написание постфиксного калькулятора со стеком и итератором

#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;
}

Моя проблема в том, что всякий раз, когда я запускаю его, код, кажется, сегментирует ошибку. Когда я попытался запустить его с оператором, прокомментировавшим это, в стеке появилось два значения, и я не совсем уверен, почему

2 ответа

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

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

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

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

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

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

Может случиться так, что вы начали с минуса ASCII, скопировали текст в другое приложение, и приложение пытается "придумать" минус, заменив его более эстетичным символом. Тогда вы, возможно, скопировали текст из этого приложения обратно в редактор исходного кода.

Другие вопросы по тегам