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

#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

Решение

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

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

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

1

Другие решения

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

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

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

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

1

По вопросам рекламы [email protected]