首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C 語言實現表達式求值:從四則運算到括號支持

     編輯:C 語言入門

雙棧法核心原理

表達式求值採用兩個棧:操作數棧存數字,運算符棧存運算符。掃描字符串時,根據運算符優先級決定是入棧還是先計算棧頂運算。

運算符優先級定義

運算符優先級
(0 (最低,僅作標記)
+ -1
* /2
)3 (觸發計算直到遇到 '(')

不含括號版本流程

  1. 讀到數字:解析完整數值(支持多位數),壓入操作數棧。
  2. 讀到運算符:若運算符棧為空或優先級大於棧頂,直接入棧;否則彈出兩數一運算符計算,結果入操作數棧,再將當前運算符入棧。
  3. 字符串結束:依次彈出運算符計算,直到運算符棧空。

支持括號的關鍵修改

  • 遇到 '(':無條件壓入運算符棧。
  • 遇到 ')':依次彈出計算,直到彈出 '(' 為止(括號不參與計算)。
  • 優先級判斷中,'(' 視為最低,任何運算符優先級均大於它,保證括號內優先計算。
  • 最終清空棧時,忽略殘留的括號。

關鍵函數實現片段

// 運算符優先級
int Judge_optr(char ch) {
    switch(ch) {
        case '(': return 0;
        case '+': case '-': return 1;
        case '*': case '/': return 2;
        case ')': return 3;
    }
    return -1;
}

// 執行具體運算
double Operate(double b, double a, char op) {
    switch(op) {
        case '+': return b + a;
        case '-': return b - a;
        case '*': return b * a;
        case '/': return (a == 0) ? 0 : b / a; // 需處理除零
    }
    return 0;
}

注意事項

  • 數字解析需處理連續數字字符,用 atof 轉換。
  • 棧操作必須檢查滿/空,防止溢出或下溢。
  • 減法、除法順序:第二個彈出的數在前(b - a, b / a)。
  • 錯誤處理:非法字符、除零、括號不匹配等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved