习题3.11 表达式转换(25 分)浙大版《数据结构(第2版)》题目集

Posted 给杰瑞一块奶酪~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题3.11 表达式转换(25 分)浙大版《数据结构(第2版)》题目集相关的知识,希望对你有一定的参考价值。

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过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版)》题目集的主要内容,如果未能解决你的问题,请参考以下文章

习题3.13 双端队列(25 分)浙大版《数据结构(第2版)》题目集

习题3.10 汉诺塔的非递归实现(25 分)浙大版《数据结构(第2版)》题目集

习题3.14 另类堆栈(15 分)浙大版《数据结构(第2版)》题目集

习题3.12 另类循环队列(20 分)浙大版《数据结构(第2版)》题目集

习题3.8 符号配对(20 分) 浙大版《数据结构(第2版)》题目集

习题2.3 数列求和-加强版(20 分)浙大版《数据结构(第2版)》题目集