3-06. 表达式转换(25)(我只是来寻求帮助的,一直PE求案例)

题目链接:http://pat.zju.edu.cn/contests/ds/3-06

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

输入格式说明:

输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。

输出格式说明:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

样例输入与输出:

序号 输入 输出
1
2+3*(7-4)+8/4
2 3 7 4 - * + 8 4 / +
2
((2+3)*4-(8+2))/5
2 3 + 4 * 8 2 + - 5 /
3
1314+25.5*12
1314 25.5 12 * +
4
-2*(+3)
-2 3 *
5
123
123

一直格式错误,求路过大牛点拨指教啊!

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <stack>
using namespace std;
const int maxn = 520;
stack <char>ss;
char s[maxn];

int isnum(char c)
{
    if((c>='0' && c<='9') || c=='.')
        return 1;
    return 0;
}

int val_op(char c)
{
    if(c == '(' || c == ')')
        return 1;
    else if(c == '+' || c == '-')
        return 2;
    else if(c == '*' || c == '/')
        return 3;
    return 0;
}
int main()
{
    scanf("%s",s);
    int len = strlen(s);
    int flag = 0, mark = 0;
    for(int i = 0; i < len; i++)
    {
        if(i == 0)//为了防止类似:-2*(+3)的案例
        {
            if(s[i]=='-' || s[i] == '+')
            {
                printf("%c",s[0]);
                continue;
            }
        }
        //printf("size:%d",ss.size());
        if(isnum(s[i]))//遇到运算数直接输出
        {
            if(!flag)
            {
                flag = 1;
                printf("%c",s[i]);
            }
            else if(mark == 0)//为了防止类似:-2*(+3)的案例
                printf("%c",s[i]);
            else
            {
                printf(" %c",s[i]);
                mark = 0;
            }
            continue;
        }
        if(s[i-1] == '(' && (s[i]=='+' || s[i]=='-'))
        {
            continue;
        }
        mark = 1;//为了防止类似:-2*(+3)的案例
        if(s[i] == '(')//遇到左括号压入栈
        {
            ss.push(s[i]);
        }
        else if(s[i] == ')')//遇到右括号把栈内的运算符输出知道遇到左括号
        {
            while(ss.top()!='(')
            {
                printf(" %c",ss.top());
                ss.pop();
            }
            // printf(" d%cd ",ss.top());
            ss.pop();
        }
        else if(ss.size())
        {
            if(val_op(s[i]) <= val_op(ss.top()))//如果遇到的运算符的优先级小于等于栈顶运算符
            {
                while(ss.size())
                {
                    char tc = ss.top();
                    if(val_op(tc) < val_op(s[i]))//直到当前运算符的优先级大于栈顶运算符
                    {
                        //ss.push(tc);
                        break;
                    }
                    if(tc!='(' && tc != ')')
                        printf(" %c",tc);
                    ss.pop();
                }
            }
        }
        if(s[i]!='(' && s[i]!=')')
            ss.push(s[i]);
    }
    if(ss.size())//输出栈内的运算符
    {
        int len = ss.size();
        for(int i = 0; i < len; i++)
        {
            if(ss.top()!='(' && ss.top()!=')')
                printf(" %c",ss.top());
            ss.pop();
        }
    }
    printf("\n");
    return 0;
}

/*
2*(9+6/3-5)+4

-2*(+3)
*/
时间: 2024-11-10 07:36:33

3-06. 表达式转换(25)(我只是来寻求帮助的,一直PE求案例)的相关文章

5-20 表达式转换 (25分)

5-20 表达式转换 (25分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中给出不含空格的中缀表达式,可包含+.-.*.\以及左右括号( ),表达式不超过20个字符. 输出格式: 在一行中输出转换后的后缀表达式,要求不同对象(运算数.运算符号)之间以空格分隔,但结尾不得有多余空格. 输入样例: 2+3*(7-4)+8/4 输出样例: 2 3 7 4

【表达式转换 (25 分)】

题目分析 首先规定优先级,括号为最高优先级,乘号或除号为次优先级,加或减号为最低优先级,至于数字,碰到就直接输出即可. 既然是数字,就有小数,整数,正数,负数之分,还有关于二元运算符的输出,在括号内的二元运算符优先输出,优先级高的优先输出(当然括号不算啊) 根据题意,在输出时可分为以下几种情况. (+1...... +1...... 对于正号,是不能输出的 -1...... 3 34... 3.4... (注意:上面的...指一堆未知长度的数字) 碰到 )符号,将与它对应的括号这之间的符号从栈内

中缀表达式转换前\后缀表达式的总结

本次个人程序设计要求做一个带有计算功能的程序,而要计算就离不开表达式,按照一般人的习惯,中缀表达式是一个非常常用的方式.但是,对于我们程序员来说,直接计算中缀表达式并不是那么方便,因此,通常来说我们会将中缀表达式进行转换. 不论是转成前缀表达式还是后缀表达式,通过树进行转换都是可以实现的,同时,一棵树就能完成前\中\后缀表达式的互相转换,因此如果仅仅要求转换并且频繁的转换,建立一棵树无疑是方便的.但是,对于计算而言,转换只是其中的一步,因此我们更要考虑效率问题,那么堆栈法就成了我们的首选.堆栈是

ZH奶酪:Python 中缀表达式转换后缀表达式

实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: (1)操作数:直接输出到pool (2)操作符:判断当前操作符与stack[top]操作符的优先级 <1>当前操作符优先级高于stack[top]:将当前操作符添加到stack中: <2>当前操作符优先级低于或等于stack[top]:从stack[top]开始出栈,直到stack[to

7-20 表达式转换

7-20 表达式转换(25 分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中给出不含空格的中缀表达式,可包含+.-.*.\以及左右括号(),表达式不超过20个字符. 输出格式: 在一行中输出转换后的后缀表达式,要求不同对象(运算数.运算符号)之间以空格分隔,但结尾不得有多余空格. 输入样例: 2+3*(7-4)+8/4 输出样例: 2 3 7 4 -

Informatica转换组件之表达式转换

作用 表达式转换属于消极转换组件,换言之是单行运算,来源的列值通过一系列表达式转换(函数转换)后得出的一行输出结果. 注意:多行运算请使用聚合转换组件. 使用 要使用表达式转换进行单行运算,必须要包含以下端口: 要计算的值输入端口或者输出端口 表达式转换组件的输出端口 数据流图 创建表达式转换步骤 1. 在Mapping Designer中选择‘转换 - 创建’.选择表达式转换,输入名称后确定. 2. 创建输入端口. 如果源端输入组件(Source)已有可用的输入,则从源端的列菜单中选择一个或者

分支-06. 成绩转换(15)

#include<iostream>using namespace std;int main(){    int p;    while(cin>>p)        if(p>=90)            cout<<"A"<<endl;        else if(p>=80)            cout<<"B"<<endl;        else if(p>=

lambda表达式转换sql

这是我在博客园的第一遍文章,想分享下lambda表达式转换sql. 喜欢EF的便捷与优雅,不喜欢生成的一坨sql.(PS:公司封装了一套访问数据库的方法,所以不确定是不是EF的问题,反正就是一坨密密麻麻的的sql,我有点点处女座小纠结,虽然我是天蝎座) 好了,废话少说. using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using System.Linq.Expr

数据结构实验之栈二:一般算术表达式转换成后缀式

数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/e)*f# 示例输出 ab*cde/-f*+ 提示 来源 示例程序 由一般是求后缀式: 1.设立暂时存放运算符的栈: 2.设表达式的结束符为"#