Postfix评估中的数据类型转换

时间:2014-12-31 12:23:54

标签: c

为什么我们通过exp [i] - ' 0'如果exp [i]是一个数字,但在操作符的情况下不做同样的操作,即val2操作符val1 - ' 0'。我猜它与ascii有关,我们想要插入2然后ascii of char 2 - ascii of char 0 = 2 in decimal,我们将它推入堆栈(这是int数组,但参数是char op)但是如果是运营商,我们也不会这样做。如果我们在push中接收第二个参数,那么#34; char"那么为什么我们需要将它转换为ascii呢?如果我们在push的第二个参数中将char更改为int op,它也不会影响输出? [链接] http://geeksquiz.com/stack-set-4-evaluation-postfix-expression/

void push(struct Stack* stack, char op)
{
stack->array[++stack->top] = op;
}

int evaluatePostfix(char* exp)
{
struct Stack* stack = createStack(strlen(exp));
int i;
if (!stack) return -1;
for (i = 0; exp[i]; ++i)
{
    // If the scanned character is an operand or number,
    // push it to the stack.
    if (isdigit(exp[i]))
        push(stack, exp[i] - '0');

    //  If the scanned character is an operator, pop two
    // elements from stack apply the operator
    else
    {
        int val1 = pop(stack);
        int val2 = pop(stack);
        switch (exp[i])
        {
         case '+': push(stack, val2 + val1); break;
         case '-': push(stack, val2 - val1); break;
         case '*': push(stack, val2 * val1); break;
         case '/': push(stack, val2/val1);   break;
        }
    }
}
return pop(stack);
}
int main()
{
char exp[] = "231*+9-";
printf ("Value of %s is %d", exp, evaluatePostfix(exp));
return 0;
}

2 个答案:

答案 0 :(得分:0)

char变量根据相应的ASCII值保存字符

要将ASCII表示'1'转换为整数值1,您需要从0中减去'0',[char]的ASCII值值。然后,您可以对这些+值执行算术运算-*/int

例如,'5'的ASCII值为53.减去'0' [48]的ASCII值会使(53-48)= 5,为整数。

这就是为什么,对于数字[注意使用isdigit(exp[i])],'0'被减去。但是,运算符不需要它,因为它们不用作操作数。

相关阅读:ASCII table

答案 1 :(得分:0)

  

如果exp [i]是数字,我们为什么在推送中传递exp[i]- '0'但在运算符的情况下不执行相同操作

这是因为digitChar-'0'表达式的值是有意义的:它表示数字的数值,因为数字字符的数字代码是连续的。相反,从运算符中减去任何东西并没有给你带来任何好处,因为运算符的数字代码顺序。

  

此外,如果我们在推送中收到第二个参数为char op,那么为什么我们需要将其转换为ascii

我们没有 - op保持与您的系统使用的编码相同。

  

如果我们在push的第二个参数中将char更改为int op,它也不会影响输出?

它有效,因为我们使用char op作为其数值。当您在array内对struct Stack进行分配时,编译器会将int转换为array的元素类型,因此没有区别。