算術表達式有前綴表示法、中綴表示法和后綴表示法等形式。日常使用的算術表達式是采用中綴表示法,即二元運算符位於兩個運算數中間。請設計程序將中綴表達式轉換為后綴表達式。
輸入格式:
輸入在一行中給出不含空格的中綴表達式,可包含+、-、*、\以及左右括號(),表達式不超過20個字符。
輸出格式:
在一行中輸出轉換后的后綴表達式,要求不同對象(運算數、運算符號)之間以空格分隔,但結尾不得有多余空格。
輸入樣例:
2+3*(7-4)+8/4
輸出樣例:
2 3 7 4 - * + 8 4 / +
由於當時提交對了,沒去深究,后來同學發現了錯誤,進行了更改。
思路搞清楚就好,比較煩人有小數,有正負號,正好不用輸出,負號要隨數字輸出,所以總的分為兩塊第一塊是數字包括1-9和小數點,以及第一位就是正負的或者括號后面緊跟着正負,這些屬於數字,第二類就是負號加減乘除以及括號,左括號要讀入,在與他匹配的右括號出現之前,只輸出左括號之后的負號,右括號出現,則抵消掉左括號繼續輸出。
c++
代碼:
#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 --; } 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; }
c
代碼:
#include <stdio.h> #include <stdlib.h> void printk() { static int flag = 0; if(flag)putchar(' '); flag ++; } int main() { char s[21]; int c = 0; char a[21]; scanf("%s",a); for(int i = 0;a[i];i ++) { if((a[i] == '+' || a[i] == '-') && (!i || a[i - 1] == '(') || a[i] >= '0' && a[i] <= '9') { printk(); if(a[i] != '+') { putchar(a[i]); } while(a[i + 1] == '.' || a[i + 1] >= '0' && a[i + 1] <= '9') { i ++; putchar(a[i]); } } else { if(a[i] == ')') { while(c && s[c - 1] != '(') { printk(); putchar(s[-- c]); } if(c)-- c; } else { if(!c) { s[c ++] = a[i]; continue; } while(c && s[c - 1] != '(') { if(a[i] == '(' || (a[i] == '*' || a[i] == '/')&&(s[c - 1] == '-' || s[c - 1] == '+')) { break; } printk(); putchar(s[-- c]); } s[c ++] = a[i]; } } } while(c) { printk(); if(s[c - 1] != '(')putchar(s[-- c]); } }
