swust oj(0088)表达式的转换

表达式的转换(0088)

Time limit(ms): 5000

Memory limit(kb): 65535

Submission: 435

Accepted: 93

Accepted

16级卓越班选拔D 14级卓越班选拔D 15级卓越班选拔D

平常我们书写的表达式称为中缀表达式,因为它将运算符放在两个操作数中间,许多情况下为了确定运算顺序,括号是不可少的,而后缀表达式就不必用括号了。后缀标记法:书写表达式时采用运算紧跟在两个操作数之后,从而实现了无括号处理和优先级处理,使计算机的处理规则简化为:从左到右顺序完成计算,并用结果取而代之。例如:8-(3+2*6)/5+4可以写为:8 3 2 6*+5/-4+ 其计算步骤为:

(1):8 3 2 6 * + 5 / -4 +

(2):8 3 12 + 5 / - 4 +

(3):8 15 5 / - 4 +

(4):8 3- 4 +

(5):5 4 +

(6):9

编写一个程序,完成这个转换,要求输出的每一个数据间都留一个空格。

Description

就一行,是一个中缀表达式。输入的符号中只有这些基本符号“0123456789+-*/^()”,并且不会出现形如2*-3的格式。表达式中的基本数字也都是一位的,不会出现形如12形式的数字。所输入的字符串不要判错。

Input

若干个中缀表达式,第I+1行比第I行少一个运算符和一个操作数,最后一行只有一个数字,表示运算结果。运算的结果可能为负数,“/”以整除运算。并且中间每一步都不会超过2^31。

Output

1

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

Sample Input

1

2

3

4

5

6

8 3 2 6 * + 5 / - 4 +

8 3 12 + 5 / - 4 +

8 15 5 / - 4 +

8 3 - 4 +

5 4 +

9

Sample Output

温馨提示:优先级‘^‘  >  ‘*‘  =  ‘/‘  >  ‘+‘   = ‘-’

分析:(这道题需要中缀转后缀的基础) 有空我再写个中缀转后缀的 详解

这个题变态就变态在 每一步都要输出

所以转换为后缀表达式后还要一步一步处理

由于后缀表达式中既有数字也有字符 所以我采取的方法是 将字符转换为较大的数字 方便处理;

然后就是 后缀表达式的计算  输出 和 更新了。

还是直接贴代码吧;

#include<iostream>
#include<stack>
#include<cmath>
#define INT_MAX 2147483647
using namespace std;
int k,data[100];
string str;
int get_priority(const char& x)//获取优先级
{
    switch(x)
    {
        case ‘+‘:
        case ‘-‘: return 1;break;
        case ‘*‘:
        case ‘/‘: return 2;break;
        case ‘^‘: return 3;break;
        case ‘(‘: return 4;break;
        case ‘)‘: return 0;break;
        default: return -1;
    }
}
int convert(const char& x)//将字符转换为较大的整数
{
    switch(x)
    {
        case ‘+‘:return INT_MAX-1; break;
        case ‘-‘:return INT_MAX-2; break;
        case ‘*‘:return INT_MAX-3; break;
        case ‘/‘:return INT_MAX-4; break;
        case ‘^‘:return INT_MAX-5; break;
    }
}
void Cout()//输出处理 要将整数对应的字符转换过来
{
    for(int i=0;i<k;i++)
    {
        switch(data[i])
        {
            case INT_MAX-1: cout<<‘+‘; break;
            case INT_MAX-2: cout<<‘-‘; break;
            case INT_MAX-3: cout<<‘*‘; break;
            case INT_MAX-4: cout<<‘/‘; break;
            case INT_MAX-5: cout<<‘^‘; break;
            default: cout<<data[i];
        }
        if(i!=k-1)cout<<" ";
    }
}
int judge(const int& x) //判断这个较大的数表示的是那个字符
{
    switch(x)
    {
        case INT_MAX-1: return 1; break;
        case INT_MAX-2: return 2; break;
        case INT_MAX-3: return 3; break;
        case INT_MAX-4: return 4; break;
        case INT_MAX-5: return 5; break;
        default: return 0;
    }
}
void step()//按步计算
{
    for(int i=0;i<k;i++)
    {
        if(judge(data[i])!=0)
        {
            switch(judge(data[i]))
            {
                case 1:data[i-2]=data[i-2]+data[i-1]; data[i]=data[i-1]=INT_MAX; break;
                case 2:data[i-2]=data[i-2]-data[i-1]; data[i]=data[i-1]=INT_MAX; break;
                case 3:data[i-2]=data[i-2]*data[i-1]; data[i]=data[i-1]=INT_MAX; break;
                case 4:data[i-2]=data[i-2]/data[i-1]; data[i]=data[i-1]=INT_MAX; break;
                case 5:data[i-2]=pow(data[i-2],data[i-1]); data[i]=data[i-1]=INT_MAX; break;
            }
            break;
        }
    }
    int t=0;
    for(int i=0;i<k;i++)//更新
    {
        if(data[i]!=INT_MAX)
        data[t++]=data[i];
    }
    k=t;
}
int main()
{
    while(cin>>str)
    {
        k=0; stack<char>q;
        for(int i=0;i<str.size();i++)
        {
            if(get_priority(str[i])==-1)
            {data[k++]=str[i]-‘0‘; continue;}
            if(q.empty()) q.push(str[i]);
            else if(str[i]==‘)‘)
            {
                while(q.top()!=‘(‘)
                {
                    data[k++]=convert(q.top()); q.pop();
                }
                q.pop();
            }
            else{
                while(get_priority(q.top())>=get_priority(str[i])&&q.top()!=‘(‘&&!q.empty())
                {
                    data[k++]=convert(q.top()); q.pop(); if(q.empty()) break;
                }
                q.push(str[i]);
            }
        }
        while(!q.empty())
        {
            data[k++]=convert(q.top()); q.pop();
        }
        //前面的都是中缀表达式转后缀表达式的内容;
        Cout(); cout<<endl;
        while(k>1)
        {
        step();
        Cout(); cout<<endl;
        }
    }
    return 0;
 } 
时间: 2024-10-07 06:10:07

swust oj(0088)表达式的转换的相关文章

swust oj 1026--Egg pain&#39;s hzf

题目链接:http://acm.swust.edu.cn/problem/1026/ Time limit(ms): 3000 Memory limit(kb): 65535 hzf is crazy about reading math recently,and he is thinking about a boring problem. Now there are n integers Arranged in a line.For each integer,he wants to know

SWUST OJ Euclid&#39;s Game(0099)

Euclid's Game(0099) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 1855 Accepted: 589 Description Starts with two unequal positive numbers (M,N and M>N) on the board. Two players move in turn. On each move, a player has to write on the boar

SDUTOJ 2484 算术表达式的转换(栈)

算术表达式的转换 Time Limit: 1000MS Memory limit: 65536K 题目描述 小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下. 因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑.聪明的你帮他解决吧. 输入 输入一算术表达式,以\'#\'字符作为结束标志.(数据保证无空格,只有一组输入) 输出 输出该表达式转换所得到的前缀式 中缀式 后缀式.分三行输出,顺序

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

swust oj 649--NBA Finals(dp,后台略(hen)坑)

题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two teams, Lakers and Celtics, playing a series of NBA Finals until one of the teams wins n games. Assume that the probability of Lakers winning a game is

线段树 [SWUST OJ 764] 校门外的树 Plus Plus

校门外的树 Plus Plus(0764) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 214 Accepted: 15 Description 西南某科技大学的校门外长度为 L 的公路上有一排树,每两棵相邻的树之间的间隔都是 1 米.我们可以把马路看成一个数轴,马路的一端在数轴 1 的位置,另一端在 L 的位置:数轴上的每个整数点,即 1,2,……,L,都种有一棵树. 现在要将这排树的某一段涂成某种颜色,给定 N 组区间[ 

背包 [POJ 2184 SWUST OJ 145] Cow Exhibition

Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9479   Accepted: 3653 Description "Fat and docile, big and dumb, they look so stupid, they aren't much  fun..."  - Cows with Guns by Dana Lyons The cows want to prove to

[Swust OJ 404]--最小代价树(动态规划)

题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和. 例如:((4+1)+ (2+3))=((5)+(5))=10.除去原数不4,1,2,3之外,其余都为中间结果,如5,5,10,将中间结果相加

数据结构之 栈和队列---算术表达式的转换(前缀+中缀+后缀)

算术表达式的转换 Time Limit: 1000MS Memory limit: 65536K 题目描述 小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下. 因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑.聪明的你帮他解决吧. 输入 输入一算术表达式,以\'#\'字符作为结束标志.(数据保证无空格,只有一组输入) 输出 输出该表达式转换所得到的前缀式 中缀式 后缀式.分三行输出,顺序