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 ..第二个代码对我来说是正确的,但它没有给我正确的输出
我的问题是
c-'0'
而不仅仅是c
?case '-' : result = y - x
的原因而不是x - y
?case '/' : result = y / x
的原因而不是x / y
?提前致谢
答案 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编码的计算机上)。
关于x
和y
的顺序,嗯,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,但在这种情况下顺序不会改变结果)。
请注意,如果字符串的格式与示例中的字符串完全不同,则此代码将无法正常工作。