string op1 = topPtr->item;
pop();
string op2 = topPtr->item;
pop();
вы всегда выталкиваете 2 операнда оператора, который предполагает, что вы выдвигаете результат, но вы этого не делаете, в данный момент времени topPtr становится нулевым, с вашим примером это когда вы делаете string op2 = topPtr->item;
для меня numb = numb + ope(pre_exp[i],op1,op2);
необходимо заменить, поместив результат ope(pre_exp[i],op1,op2)
в стек в месте двух всплывающих значений
так для {"+","-","2","3","9"}
:
- толчок 9
- толчок 3
- толчок 2
-
так что pop = 2 - pop = 3 = -1, и вам нужно нажать -1
+
так что pop = -1 + pop = 9 = 8 и вы нажимаете 8 (без нажатия -1 до того, как стек пуст при получении второго операнда)
- все сделано, чтобы вы получили результат = 8
Тем не менее, я удивлен, что вы, звезда, в конце выражения, я не уверен, что во всех случаях хорошо работает результат, почему вы не начинаете с начала?
Последнее замечание: все ваши методы стараются быть встроенными (определены в классе), мы используем встроенный, когда метод маленький, лучше переместить определения из класса для ваших методов