習題3.11 表達式轉換(25 分)浙大版《數據結構(第2版)》題目集
阿新 • • 發佈:2017-10-07
lang == lan 包括 設計程序 不用 運算 出現 加減
算術表達式有前綴表示法、中綴表示法和後綴表示法等形式。日常使用的算術表達式是采用中綴表示法,即二元運算符位於兩個運算數中間。請設計程序將中綴表達式轉換為後綴表達式。
輸入格式:
輸入在一行中給出不含空格的中綴表達式,可包含+
、-
、*
、\
以及左右括號()
,表達式不超過20個字符。
輸出格式:
在一行中輸出轉換後的後綴表達式,要求不同對象(運算數、運算符號)之間以空格分隔,但結尾不得有多余空格。
輸入樣例:
2+3*(7-4)+8/4
輸出樣例:
2 3 7 4 - * + 8 4 / +
思路搞清楚就好,比較煩人有小數,有正負號,正好不用輸出,負號要隨數字輸出,所以總的分為兩塊第一塊是數字包括1-9和小數點,以及第一位就是正負的或者括號後面緊跟著正負,這些屬於數字,第二類就是負號加減乘除以及括號,左括號要讀入,在與他匹配的右括號出現之前,只輸出左括號之後的負號,右括號出現,則抵消掉左括號繼續輸出。
代碼:
#include <iostream> #include <map> #include <algorithm> #include <stack> using namespace std; void printk() { static int flag = 0; if(flag)cout<<‘ ‘; flag ++; } int main() { char s[50]; int c = 0; string a; cin>>a; map<char,int>p; p[‘*‘] = p[‘/‘] = 1; p[‘(‘] = p[‘)‘] = 2; for(int i = 0;i < a.size();i ++) { if((i < 1 || a[i - 1] == ‘(‘)&&(a[i] == ‘+‘ || a[i] == ‘-‘) || a[i] == ‘.‘ || a[i] >= ‘0‘ && a[i] <= ‘9‘) { printk();if(a[i] != ‘+‘)cout<<a[i]; while(a[i + 1] == ‘.‘ || a[i + 1] >= ‘0‘ && a[i + 1] <= ‘9‘) { i ++; cout<<a[i]; } } else { if(a[i] == ‘)‘) { while(c && s[c - 1] != ‘(‘) { cout<<‘ ‘<<s[c - 1]; c --; } c --; while(c && s[c - 1] != ‘(‘) { cout<<‘ ‘<<s[c - 1]; c --; } } else if(!c || p[a[i]] > p[s[c - 1]]) { s[c ++] = a[i]; } else { while(c && s[c - 1] != ‘(‘) { cout<<‘ ‘<<s[c - 1]; c --; } s[c ++] = a[i]; } } } while(c) { cout<<‘ ‘<<s[c - 1]; c --; } cout<<endl; }
習題3.11 表達式轉換(25 分)浙大版《數據結構(第2版)》題目集