В коде много ошибок, начиная с разбора входного выражения. Скорее всего, фактический сбой объясняется тем, что если вы введете что-то вроде "12+"
, вы вставите '1'
и '2'
в стек (примечание: символы 1 и 2, а не значения 1 и 2 !!!) и затем попытайтесь извлечь два операнда и оператор, который вы никогда не вставляли в стек.
При синтаксическом анализе ввода вы читаете символ за символом, и только с использованием первой цифры синтаксический анализ не может обрабатывать пробелы или любой другой разделитель ... Попробуйте разбить проблему на две части: анализ и обработка. Проблему синтаксического анализа можно решить, не используя фактические прочитанные значения, а просто печатая их (или сохраняя в некоторой форме, а затем печатая все прочитанное выражение), и может быть первым шагом. Убедитесь, что синтаксический анализатор может работать с общими выражениями, такими как «1 2+», «10 20+», «1 2+», «1 2+» (обратите внимание на различные позиции пробелов) надежным способом. И что он не в состоянии изящно разобрать выражения, такие как "+", "1 +", "1 2 ++" ... Вы никогда не можете доверять пользовательскому вводу, они допустят ошибки, и это не должно поставить вашу программу на колени.
Как только вы уверены, что сможете проанализировать ввод, начните с самого алгоритма. Сделайте его устойчивым к недопустимым пользовательским вводам, которые вы, возможно, раньше не могли обработать, например, «10 0 /», и выполняйте фактическую обработку.
Научитесь использовать отладчик, он поможет вам понять, когда дела идут на юг, в чем причины. Отладчику потребуется менее одной секунды, чтобы указать на конкретную проблему в вашем коде выше, он не скажет вам, почему он умер, но покажет вам, как он умер и каково было состояние программы. Если моя догадка верна, то она укажет вам на команду operation.top()
как на виновника, и вы увидите, что пытались извлечь больше элементов, чем было вставлено. Выполните часть вашей программы шаг за шагом, чтобы понять, что она на самом деле делает, и вы заметите, что когда вы читаете «12+», вы фактически сохраняете два, казалось бы, не связанных целых числа в стек (значения ASCII '1'
и '2'
...