-3
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+ stores 8 -> return result happens and when I print it on the main I get 8 as a output.. which is correct

if I replace this code

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

with this one

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

the output looks like this = 104.. the second code looks correct to me but it doesn't give me the correct output

My questions are

  1. why c-'0' is used and not a c only ?
  2. why case '-' : result = y - x is used and not x - y ?
  3. why case '/' : result = y / x is used and not x / y ?

Thanks in advance

4

4 回答 4

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,但在这种情况下顺序不会改变结果)。

请注意,此代码不适用于两位以上的数字,或者当字符串的格式与示例中的格式不完全相同时。

于 2012-12-29T22:58:22.720 回答
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

于 2012-12-29T22:38:06.817 回答
1

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

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

关于 and 的顺序xy嗯,x在堆栈的顶部,换句话说,最后被推,并且y是第二个最上面的,所以你想使用哪个顺序......如果你想要正常的顺序,那就是字符串"yx/"意味着y / x,然后你需要这样写。

于 2012-12-29T22:40:27.727 回答
1

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

char c = s.charAt(i);

应该:

char c = hello.charAt(i);

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

44+  is 4+4 

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

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

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

至于操作的顺序,按照Postfix Expression操作应该按一个顺序进行:

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

以另一种方式(y/x例如)这样做是一个错误。

于 2012-12-29T22:41:16.323 回答