1. 程式人生 > >習題3.11 表達式轉換(25 分)浙大版《數據結構(第2版)》題目集

習題3.11 表達式轉換(25 分)浙大版《數據結構(第2版)》題目集

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版)》題目集