2014-12-31 59 views
1

如果exp [i]是一個數字,爲​​什麼我們在推送過程中傳遞exp [i] - '0',但在運算符的情況下不會這樣做:val2運算符val1 - ' 0' 。我想這與ascii有關,我們想插入2然後ascii的char 2 - ASCII的char 0 = 2在十進制中,我們把它推入棧(這是int數組,但參數是字符操作),但我們不如果它是一個操作員,也要這樣做。另外,如果我們將push中的第二個參數作爲「char」op來接收,那麼爲什麼我們需要將其轉換爲ascii,並且如果我們在第二個參數push中將char更改爲int op,它也不會影響輸出? 一個連結[] http://geeksquiz.com/stack-set-4-evaluation-postfix-expression/Postfix評估中的數據類型轉換

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; 
} 

回答

0

爲什麼我們通過exp[i]- '0'如果在EXP [i]是一個數字的推動,但不這樣做的運營商

的情況下,這是因爲digitChar-'0'表達式的值是有意義的:它表示數字的數字值,因爲數字字符的數字代碼是連續的。相反,從運營商減去任何東西不會給你帶來任何好處,因爲運營商的數字代碼是而不是連續的。

此外,如果我們爲char op接收推第二個參數那麼爲什麼我們需要將其轉換成ASCII

我們不 - op留在您的系統使用相同的編碼。

它也不會影響輸出,如果我們將字符更改爲INT操作的第二個參數推?

它的工作原理是因爲我們的數值使用了char op。當您在struct Stack內部編排array時,編譯器將int轉換爲array的元素類型,因此沒有區別。

+0

char c [] = {1,2,3,4}; int z = c [1] - '0'; printf(「%d」,z);它打印-46 但你說digitchar - '0'應該給我們數字值,在這種情況下,它應該給我們2(50-48) – Stack

+0

@Stack這不是我說的。我說如果你做'char c [] = {'1','2','3','4'};'你會得到數字值。您示例中的{1,2,3,4}不是數字字符代碼(它們甚至在許多系統上都不可打印)。 – dasblinkenlight

+0

爲結構編譯器隱式轉換它。從輸入數組,當我們通過exp [1]沒有 - '0'它評估爲50,確實exp [1] =='1'或1? – Stack

0

基於它們相應的ASCII值的char變量保存字符

要轉換的ASCII表示'1'爲整數值1,你需要減去的0的ASCII值,['0']從char值。然後您可以對這些值執行算術運算+,-,*/

例如,'5'的ASCII值爲53.減去'0' [48]的ASCII值會使(53-48)= 5爲整數。

這就是爲什麼,對於數字[請注意使用isdigit(exp[i])],'0'被扣除。但是,運算符不需要這個,因爲它們不被用作操作數。

相關閱讀:ASCII table

+0

char p = 2; int a = c; printf(「%d」,a)打印2 可以解釋這是如何工作的bcoz 2(而不是'2')不是char,但我們將它分配給char? – Stack

+0

@stack使用''2''並檢查。 :-) –

+0

@stack也用於字符,格式說明符是'%c' –