2014-03-13 44 views
1

我想驗證我對堆棧的理解。當我開始瞭解基本知識並且我仍然有一段路要走的時候,我發現了一個引起我好奇心的例子。java堆棧和一個明顯的毫無意義的練習

我的研究包括此線程:

Understanding Postfix-expression Evaluation in Java code using a stack

我從我上面提到的線程在特定一行混淆。

這裏是整個代碼段 - 我的問題是指while循環線路 - 代碼後的細節:

 public static void main(String[] args) 
    { 
    char[] a = args[0].toCharArray(); 
    int N =a.length; 
    intStack s = new intStack(); 
    for (int i = 0; i<N; i++) 
    { 
     if (a[i]=='+') 
     { 
      s.push(s.pop() + s.pop()); 
     } 
     if (a[i]=='*') 
     { 
      s.push(s.pop() * s.pop()); 
     } 
     if ((a[i] >= '0') && (a[i] <= '9')) 
     { 
      s.push(0); 
     } 
     while ((a[i] >= '0') && (a[i] <= '9')) 
     { 
      s.push(10*s.pop() + (a[i++]-'0')); 
     } 
     Out.println(s.pop() + ""); 
    } 
    } 

我的問題是這樣的:它的-'0'起什麼作用?如果我正確理解其餘部分,我們引用char 0(由於單引號),並且-似乎是減法運算符。減去零 - 一個硬編碼的零,而不是偶爾偶爾會發生的變量 - 似乎毫無意義。

我目前的假設是,對此有一個細微差別的答案 - 也就是說它只是/看起來/是毫無意義的練習,但是有一些真正神奇的事情發生,我簡直太難以理解了。

在此先感謝大家 - 我從建議中學到了很多 - 這很快就成爲我最喜歡和訪問量最大的網站之一。

此致

+0

非常感謝您的答覆 - 非常有意義了。與我以前在Excel中完成的操作非常相似 - 將格式爲文本(字符串)的數字乘以1以將單元格轉換爲數字。 在最後一行發生了類似的情況嗎? '+「」)' – Mac

回答

3

由於achar陣列,其保持數字位數,a[i++]-'0'是在a[i++]得到char的數值的一個快速的方法。把它看作是從ASCII代碼中減去0的ASCII代碼,以得到字符數組中該位置的任何東西。

2

字符用一些編碼表示。在ASCII中,字符0由48表示,1等於49等。因此,如果編碼字符在[48,57]之間,那麼減去'0'(值爲48)即可得到字符的整數值。

0

-'0'只是asciiints之間轉換的簡寫方法。您的堆棧將單個數字的數字存儲爲chars,請參閱下面的第二個轉換。

enter image description here

轉換爲1位數字int從數字char數字char

int x = 1; 
char c = x + '0'; 

轉換爲從int詮釋

char c = '5'; 
int x = c - '0'; 

轉換爲小寫字母char(0 ='一',25 ='z ')從小寫字母char

int x = 1; 
char c = x + 'a'; 

轉換爲int從int

char c = 'm'; 
int x = c - 'a'; 

轉換成大寫字母char(0 =' A」,25 = 'Z')

int x = 1; 
char c = x + 'A'; 

從大寫字母char轉換爲int

char c = 'M'; // 'M'=77 
int x = c - 'A'; // 77-65=12 therefore 'M is element 12 of the alphabet (A=0) 

這些工作,因爲:

0+48 = 0+'0' = '0' 
0+65 = 0+'A' = 'A' 
0+97 = 0+'a' = 'a' 
+0

嗨,羅恩 - 這裏有很多很棒的信息,非常感謝。我試圖圍繞在實際場景中實現轉換來實現我的目標。增加或減少值取決於你開始的類型和你想要轉換的東西。這就說得通了。 在您的示例中,您將'a'和'A'賦值爲0--我假設這只是表示它是第一個字母 - 當我期望從上面的表中看到一個值時,我很困惑(97或65)。 那麼,如果x = 1並且我們添加'a',那麼返回'b'嗎? – Mac

+0

@Mac是的! 1 +'a'='b'也許你應該回顧一下'char'是一種數字類型,''a''與'97'和'0x61'完全相同。 – Ron