資料結構與演算法題目集7-20——表示式轉換
阿新 • • 發佈:2018-12-05
我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set
原題連結:https://pintia.cn/problem-sets/15/problems/827
題目描述:
知識點:中綴表示式轉字尾表示式
思路:利用棧將中綴表示式轉換為字尾表示式
將中綴表示式轉化為字尾表示式的規則:
從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序不高於棧頂符號則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。
本題的難點在於如何區分數字和符號,題給的數字可能是小數,也可能是帶負號的負數,也可能是帶正號的正數。
時間複雜度和空間複雜度均是O(N),其中N為所給字串的長度。
給出本題各個測試點的測試資料:
序號 | 輸入 | 輸出 | 說明 |
0 | 2+3*(7-4)+8/4 | 2 3 7 4 - * + 8 4 / + | 正常測試6種運算子 |
1 | ((2+3)*4-(8+2))/5 | 2 3 + 4 * 8 2 + - 5 / | 巢狀括號 |
2 | 1314+25.5*12 | 1314 25.5 12 * + | 運算數超過1位整數且有非整數出現 |
3 | -2*(+3) | -2 3 * | 運算數前有正負號 |
4 | 123 | 123 | 只有一個數字 |
C++程式碼:
#include<iostream> #include<cstring> #include<stack> using namespace std; bool isDigit(char c); bool isPositiveOrNegative(char c); bool isTimeForPoping(char c1, char c2); int main() { char input[21]; scanf("%s", input); bool space = false; //用來標記是否需要輸出空格 stack<char> Stack; for(int i = 0; i < strlen(input); i++) { char c = input[i]; if(isDigit(c)) { if(space) { printf(" "); space = false; } printf("%c", c); //首位的正負號肯定不是運算子 //對於不是首位的正負號,i - 1位置既不是數字也不是')'的肯定不是運算子 } else if(isPositiveOrNegative(c) && ((i == 0) || (!isDigit(input[i - 1]) && input[i - 1] != ')'))) { if(c == '-') { if(space) { printf(" "); space = false; } printf("%c", c); } } else { if(!Stack.empty()) { if(c == ')') while(!Stack.empty()) { char top = Stack.top(); Stack.pop(); if(top == '(') { break; } printf(" %c", top); } else { while(!Stack.empty()) { char top = Stack.top(); if(isTimeForPoping(top, c)) { printf(" %c", top); Stack.pop(); } else { break; } } Stack.push(c); } } else { Stack.push(c); } stack<char> Stack2; while(!Stack.empty()){ Stack2.push(Stack.top()); if(Stack.top() != '('){ space = true; //如果此時棧中包含'('外的其他符號,space需要置為true } Stack.pop(); } while(!Stack2.empty()){ Stack.push(Stack2.top()); Stack2.pop(); } } } while(!Stack.empty()) { printf(" %c", Stack.top()); Stack.pop(); } return 0; } bool isDigit(char c) { if(c >= '0' && c <= '9') { return true; } else if(c == '.') { return true; } return false; } bool isPositiveOrNegative(char c) { if(c == '+' || c == '-') { return true; } return false; } bool isTimeForPoping(char c1, char c2) { if(c2 == ')') { return true; } else if(c1 == '(' || c2 == '(') { return false; } else if(c2 == '+' || c2 == '-') { return true; } else if(c2 == '*' || c2 == '/') { if(c1 == '+' || c1 == '-') { return false; } else if(c1 == '*' || c1 == '/') { return true; } } }
C++解題報告: