Значение неожиданно заменяется во время расчета.
Я изменил тип элемента в постфиксном калькуляторе. И я попытался сделать новый стек, когда новый цикл запускается снова.
'''postfix calculator
int postcalc(char *postfix)
{
int i, A, B, val;
char ch,c;
Stack S=CreateStack (100);
i=0;
int num1;
while (postfix[i] !='\0')
{
ch = postfix[i];
if (isdigit(ch))
{
num1 = atoi(&ch);
Push(num1,S);
}
else if(ch=='+' || ch=='-' || ch=='*')
{
if(IsEmpty(S)) return 0;
else A=TopAndPop(S);
if(IsEmpty(S)) return 0;
else B=TopAndPop(S);
switch (ch)
{
case '+':
val = B+A;
break;
case '-':
val = B-A;
break;
case '*':
val = B*A;
break;
}
Push(val,S);
printf("%d,%d\n",val,Top(S));
}
i++;
}
if(S->TopOfStack != 1) return 0;
return Top(S);
}
TopAndPop возвращает вершину стека и одновременно удаляет вершину стека. И если элемента нет, возвращается «Пустой стек»
'' 'test calculator' ''
void test1()
{
int i, v;
char eq[][128] = {
"1234+*5678+*-9*++",
"1234+*+5678+*-9*+",
"1234+*+5678+*-9*",
"234+*+5678+*-9*+",
"1234+*+678+*-9*+"
};
printf("[Test1: postfix expression validity check]\n");
for( i=0 ; i<5 ; i++ ) {
v = postcalc(eq[i]);
if( v == 0 ) {
printf(" %s is not valid\n",eq[i]);
} else if( v == -750 ) {
printf(" %s is valid and correctly calcualted: %d\n",eq[i],v);
} else {
printf(" %s is valid but not correctly calcualted: %d\n",eq[i],v);
}
}
}
В тесте калькулятора (test1) первые два результата равны -750и другой результат не имеет значения. но фактический результат - 18, потому что -765 изменен на 3. введите описание изображения здесь