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


算術表達式有前綴表示法、中綴表示法和后綴表示法等形式。日常使用的算術表達式是采用中綴表示法,即二元運算符位於兩個運算數中間。請設計程序將中綴表達式轉換為后綴表達式。

輸入格式:

輸入在一行中給出不含空格的中綴表達式,可包含+-*\以及左右括號(),表達式不超過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]);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM