教你如何在C++中實現中綴表示式轉字尾表示式
這篇文章主要為大家詳細介紹了C++實現中綴表示式轉字尾表示式,文中示例程式碼介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下
|
一、思路:和中綴表示式的計算類似,只不過不用計算,把表示式輸出即可
1.用字元陣列儲存整行輸入的中綴表示式;
2.接著從字元陣列的0位置開始判斷字元,如果是數字,那就要判斷後面是否是數字,如果是就不斷掃描組成一個整數
(暫不考慮負數和小數),最終組成一個整數,然後輸出這個數(因為不用計算,所以直接輸出即可);
3.如果是左括號,直接進符號棧;
4.如果是操作運算子,與符號棧的棧頂元素比較優先順序:如果高就壓入棧;
低,就取出符號棧頂的元素輸出;
接著,再判斷符號棧頂的元素和當前的運算子號繼續比較優先順序,重複前面步驟,直到棧空或者當前的符號優先順序高;
5.如果是右括號,把符號棧棧頂的元素取出,如果不是左括號,把取出的運算子輸出,接著取符號棧棧頂的元素,直到符號棧中取出的符號是左括號;
6.當掃描完字元陣列時,判斷符號棧是否為空:
不為空,把符號棧棧頂的元素取出,輸出到視窗,直到符號棧為空。
二、實現程式:
// 中綴表示式轉字尾表示式 // 運算子:+、-、*、/、% // 輸入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n' // 測試資料:輸入格式:(注意:不能有中文的運算子) // 2+(3+4)*5 // 16+2*30/4 // 輸出格式: // 2 3 4 + 5 * + // 16 2 30 * 4 / + #include #include // 判斷是否是運算子 bool isOperator(char ch) { if(ch == '+' || ch == '-' || ch == '*' || ch == '/') return true; return false; // 否則返回false } // 獲取優先順序 int getPriority(char ch) { int level = 0; // 優先順序 switch(ch) { case '(': level = 1; break; case '+': case '-': level = 2; break; case '*': case '/': level = 3; break; default: break; } return level; } int main(int argc, const char * argv[]) { // insert code here... int num; char arr[250]; // 一個一個的讀取表示式,直到遇到'\0' std::stack op; // 棧op:儲存運算子 while(1) { std::cin.getline(arr,250); int len, i; char c; // c儲存從棧中取出的運算子 len = (int)strlen(arr); // strlen()輸出的是:unsigned long型別,所以要強制轉換為int型別 i = 0; while(i < len) { if(isdigit(arr[i])) { // 如果是數字 num = 0; do { num = num * 10 + (arr[i] - '0'); // ch - 48根據ASCAII碼,字元與數字之間的轉換關係 i++; // 下一個字元 }while(isdigit(arr[i])); std::cout << num << " "; } else if(arr[i] == '(') { // (:左括號 op.push(arr[i]); i++; } else if(isOperator(arr[i])) { // 運算子 if(op.empty()) {// 如果棧空,直接壓入棧 op.push(arr[i]); i++; } else { // 比較棧op頂的運算子與ch的優先順序 // 如果ch的優先順序高,則直接壓入棧 // 否則,推出棧中的運算子,直到運算子小於ch的優先順序,或者遇到(,或者棧已空 while(!op.empty()) { c = op.top(); if(getPriority(arr[i]) <= getPriority(c)) { // 優先順序低或等於 std::cout << c << " "; op.pop(); } else // ch優先順序高於棧中運算子 break; } // while結束 op.push(arr[i]); // 防止不斷的推出運算子,最後空棧了;或者ch優先順序高了 i++; } // else } else if(arr[i] == ')') { // 如果是右括號,一直推出棧中運算子,直到遇到左括號( while(op.top() != '(') { std::cout << op.top() << " "; op.pop(); } op.pop(); // 把左括號(推出棧 i++; } else // 如果是空白符,就進行下一個字元的處理 i++; } // 第二個while結束 while(!op.empty()) { // 當棧不空,繼續輸出運算子 std::cout << op.top() << " "; op.pop(); } std::cout << std::endl; flush(std::cout); } // 第一個while結束 return 0; }
執行結果:
以上就是本文的全部內容,希望對大家的學習有所幫助。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2691665/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 逆波蘭演算法、中綴表示式轉字尾表示式演算法
- 中綴轉字尾表示式思路分析和程式碼實現
- 將中綴表示式轉換為字尾表示式的簡便方法
- js實現四則計算(中綴,字尾表示式)JS
- 【資料結構與演算法】中綴表示式轉字尾表示式以及字尾表示式的計算資料結構演算法
- 算術表示式的字首式、中綴式、字尾式相互轉換
- 資料結構與演算法——棧(五)中綴表示式轉字尾表示式資料結構演算法
- 中綴表示式轉為逆波蘭表示式
- 中綴表示式
- 【資料結構】棧的應用---四則運算表示式求值(中綴表示式與字尾表示式轉換)資料結構
- 計算中綴表示式
- 資料結構 中綴表示式轉化資料結構
- 中綴表示式的計算,C++版本,Linux環境C++Linux
- 使用棧結構計算中綴表示式
- 【資料結構】棧的應用——中綴表示式求值(c++)資料結構C++
- 將算數表示式轉換成字尾表示式並計算結果
- C++ 表示式中的型別轉換C++型別
- 棧的應用---字尾表示式
- C語言- 基礎資料結構和演算法 - 09 棧的應用_中綴表示式轉字尾表示式20220611C語言資料結構演算法
- C++中的運算子和表示式C++
- 字尾表示式的求值的演算法演算法
- 【棧】【字串語法】牛牛與字尾表示式字串
- C#中的Lambda表示式和表示式樹C#
- angular中的表示式Angular
- SQLite中的表示式SQLite
- 正規表示式實現的從字串中篩選出數字字串
- C#字尾表示式解析計算字串公式C#字串公式
- 利用 Lambda 表示式實現 Java 中的惰性求值Java
- 轉義正規表示式中特殊字元字元
- 正規表示式中的特殊字元(轉)字元
- JavaScript中的正規表示式(2) (轉)JavaScript
- JavaScript中的正規表示式(1) (轉)JavaScript
- C++ 中的lambda表示式【C++11版本】C++
- Java 中的 Lambda 表示式Java
- jsp中EL表示式JS
- .NET 中的表示式樹
- 正規表示式刪除字串中的漢字字串
- vi 中的正規表示式 (Regular Expression)(轉)Express