Написание постфиксного калькулятора со стеком и итератором
#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, скопировали текст в другое приложение, и приложение пытается "придумать" минус, заменив его более эстетичным символом. Тогда вы, возможно, скопировали текст из этого приложения обратно в редактор исходного кода.