习题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]);
    }
}
原文地址:https://www.cnblogs.com/8023spz/p/7635353.html