C中的简单堆栈计算器需要帮助理解细节

时间:2012-12-29 22:31:53

标签: java evaluate

String hello = "44+"
int result=0, top=-1;
int []stack = new int[hello.length()];
for(int i=0 ; i<hello.length() ; i++)
{
    char c = s.charAt(i);
    if(c >= '0' && c <= '9')
        stack[++top]=(int)(c-'0');
    else
    {
        int x=stack[top--]; //pop
        int y=stack[top--]; //pop
        switch(c)
        {
            case '+' : result = x + y;
                break;
            case '-' : result = y - x;
                break;
            case '*' : result = x * y;
                break;
            case '/' : result = y / x;
                break;
            default : result = 0;
        }
        stack[++top]=result; //push
    }
}
result = stack[top--]; //pop
return result;

44+店8 - &gt;返回结果发生,当我在主打印时,我得到8作为输出..这是正确的

如果我替换此代码

    stack[++top]=(int)(c-'0');

这一个

    stack[++top]=(int)(c);

输出看起来像这个= 104 ..第二个代码对我来说是正确的,但它没有给我正确的输出

我的问题是

  1. 为什么使用c-'0'而不仅仅是c
  2. 使用case '-' : result = y - x的原因而不是x - y
  3. 使用case '/' : result = y / x的原因而不是x / y
  4. 提前致谢

4 个答案:

答案 0 :(得分:1)

48是'0'的ASCII。字符'0','1','2','3','4','5','6','7','8','9'的ASCII值为48,49,50 ,...,57

因此,您可以通过减去48(与-'0'相同)将数字的字符转换为其值

c - '0' 是相同的 c- 48

答案 1 :(得分:1)

c是字符代码,在C中基本上是整数。所以'0'是字符零,但它也是数字48(ASCII代码为零)。因此,要将数字字符转换为C语言整数,通常会使用c - '0'之类的代码。

换句话说,char c = '0';char c = 48;在C中完全等效(在使用ASCII编码的计算机上)。

关于xy的顺序,嗯,x位于堆栈的顶部,换句话说是推到最后,y是第2位,所以你想要使用的订单...如果你想要正常的订单,那就是字符串"yx/"意味着y / x,那么你需要这样写。

答案 2 :(得分:1)

此代码有错误,其中之一是:
这一行:

char c = s.charAt(i);

应该是:

char c = hello.charAt(i);

此代码假设采用Postfix Expression并计算总数

44+  is 4+4 

为了计算总数,你应该使用一个堆栈(在上面的代码中演示):

通过两个pop操作(x = 4和y = 4)从堆栈中取出44+,操作是第三个+

由于数字被视为字符串中的字符,因此需要将其转换为int,如果您检查 ascii table ,您会看到'0'为48所以当你取char为'4'(即52)并计算'4' - '0'时,你会得到52-48,这是所要求的4。

至于操作的顺序,根据Postfix Expression,操作应按一个顺序完成:

xy+ --> x+y
xy- --> x-y
xy/ --> x/y
xy* --> x*y

以另一种方式执行(例如y/x)是一个错误。

答案 3 :(得分:1)

字符串(例如“44+”)包含一组字符。字符串中的每个字符都由特定代码或值表示。字符串“ABC”由值65,66,67(十进制)表示。字符串“ABC0123456789”分别由值65,66,67,48,49,50,51,52,53,54,55,56,57表示。因此,要获得数字字符的数值('0'到'9'),你必须从字符的代码中减去48。

关于你的第二和第三个问题:Y是第一个推入堆栈的数字,X是推入堆栈的第二个数字。由于操作应该在第一个和第二个数字之间,它应该是YX和Y / X(它也应该是Y + X和Y * X,但在这种情况下顺序不会改变结果)。

请注意,如果字符串的格式与示例中的字符串完全不同,则此代码将无法正常工作。