簡體   English   中英

堆棧-在C中評估后綴表達式

[英]Stacks - Evaluating Postfix Expressions in C

我的任務是實現int isOperator(char *); 操作數被壓入,運算符被壓入頂部,彈出,表達式被壓入。

  Example:
  6 5 2 3.14 + 8 * + 3 + *
  Pushing: 6.000000  
  Pushing: 5.000000
  Pushing: 2.000000
  Pushing: 3.140000
  Pushing: 2.000000+3.140000=5.140000

我的實現有問題嗎? 這是我的intOperator(char *)。

int isOperator(char *s){

int i;
char Ops[] = { '+', '-', '*', '/' };

for (i = 0; i < 4; i++)
{
    if (s == Ops[i])
        return (1);
    return (0);
}
}

這是用於推入和彈出操作數和運算符的實現。

    S = CreateStack();
n = sizeof(postfixExpression) / sizeof(postfixExpression[0]); // Compute array size
for (i = 0; i<n; i++){ // Print elements of postfix expressions
    printf("%s ", postfixExpression[i]);
}
printf("\n");

for (i = 0; i<n; i++){

    if (isalnum(postfixExpression[i])){
        Push(atof(postfixExpression[i]), S);
        printf("Pushing: %d", atof(postfixExpression[i]));
    }
    else if (isOperator(postfixExpression[i]))
    {
        rightOperand = Top(S);
        Pop(Top(S));
        leftOperand = Top(S);
        Pop(Top(S));

        switch (isOperator(postfixExpression[i])){
        case '+':
            Push(leftOperand + rightOperand, S);
            printf("Pushing: %d+%d=%d", leftOperand, rightOperand, leftOperand + rightOperand);
            break;
        case '-':
            Push(leftOperand - rightOperand, S);
            printf("Pushing: %d-%d=%d", leftOperand, rightOperand, leftOperand - rightOperand);
            break;
        case '*':
            Push(leftOperand * rightOperand, S);
            printf("Pushing: %d*%d=%d", leftOperand, rightOperand, leftOperand * rightOperand);
            break;
        case '/':
            Push(leftOperand / rightOperand, S);
            printf("Pushing: %d/%d=%d", leftOperand, rightOperand, leftOperand / rightOperand);
            break;
        default:
            break;
        }

    }
    else
        break;
}

printf("%s\n", S);
DisposeStack(S);
return 0;

一個更簡單的實現是這樣的:

int isOperator(char *s)
{
    return strchr("+-*/", s[0]) && s[1] == '\0';
}

如果s的第一個字符是運算符,而第二個字符是空終止符(表示嚴格檢查,則該運算符之后沒有其他內容),則返回1(true)。

至於堆棧邏輯,應確保彈出時堆棧不為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM