表示式計算C

2021-08-09 23:15:54 字數 1545 閱讀 7363

地點:大連理工大學軟體學院

表示式計算至少需要兩個棧:1、資料棧 2、運算子棧

中綴表示式定義:

《表示式》::=《項》 + 《項》 |《項》 - 《項》 | 《項》

項 ::= 《因子》 * 《因子》 | 《因子》 / 《因子》 | 《因子》

《因子》 ::= 《常數》 | (表示式)

《常數》 ::= 《數字》 | 《數字》 《數字》

《數字》 ::= 0|1|2|3|4|5|6|7|8|9

中綴表示式計算通常按照我們習慣的先乘除後加減,有括號先算括號。

逆波蘭表示式定義:

《表示式》::=《項》《項》 + |《項》  《項》 - | 《項》

項 ::= 《因子》 《因子》 *| 《因子》  《因子》/ | 《因子》

《因子》 ::= 《常數》

《常數》 ::= 《數字》 | 《數字》 《數字》

《數字》 ::= 0|1|2|3|4|5|6|7|8|9

在逆波蘭表示式中,數字按照原來的順序出現,運算放在參與運算的兩個項或者因子後邊

比如:23 + (34 * 45)/(5 + 6 + 7)

23 34 45*  5 6 +7+/+

計算逆波蘭表示式比中綴表示式要容易一些,具體過程如下:

1、掃瞄表示式,運算元入棧

2、遇到運算子,就在棧頂取出兩個元素,用後取出的 操作 先取出的

3、將運算所得的數字進棧

4、迴圈123,直到表示式掃瞄完成,棧頂元素就是表示式的值

在計算中綴表示式時有兩種方法:1、轉化為字尾表示式 2、直接計算

1、中綴轉化字尾方法:

1)定義運算元的棧內外優先順序

2)掃瞄中綴表示式,遇到數字就輸出

2)遇到運算子,就將預算符的優先順序(棧外優先順序)與棧頂元素比較

若棧外 高於 棧內 進棧

棧外 低於 棧內,依次彈出運算子輸出,直到棧頂元素優先順序小於或者等於棧外元素優先順序

如果棧內外優先順序相等,則棧頂元素彈出,不輸出

2、直接計算和1 過程基本一致,需要在運算子出棧過程進行算術運算,同時需要管理兩個棧。

#include#include#includeint priorityisp(char op) 

return -1;

}int priorityicp(char op)

return -1;

}char* changeexp(char* exp)

if (priorityicp(exp[i]) > priorityisp(oper.top()))

oper.push(exp[i]);

else

break;

}i++;

}postfixexp[++j] = '\0';

return postfixexp;

}int calculate(char* postfixexp)

}i++;

}return cal.top() - '0';

}int main(int argc, char** argv)

C 數學表示式計算

c 計算 數學表示式 標量的值 搞個字典 string double 更具 操作符號 分割字串 更具 優先順序把資料 push stack 再每次 分別 pop 2個資料,和 乙個操作符,一直到全部結束 效果下圖如圖 部分核心 如下 空 stack 返回 true 空 stack 返回 true p...

遞迴 表示式計算 c

宣告 解法來自 北京大學 郭煒老師的程式設計與演算法 二 演算法基礎 僅作學習筆記 輸入為四則運算表示式,僅由數字 組成,沒有空格,要求求其值。假設運算子結果都是整數。結果也是整數。2 3 5 7 9 3 include include include include using namespace...

表示式計算

棧的應用舉例 棧在表示式計算過程中的應用 建立運算元棧和運算子棧。運算子有優先順序。規則 自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續...