NYOJ 467

简介:   中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。

 

中缀式变后缀式

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
 
描述
人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
 
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组中缀式相应的后缀式,要求相邻的操作数操作符用空格隔开。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.000 2 4 / + =
1 2 + 5 * 1 + 4 / =
/*
一、算法思想
声明一个数组S2用于存放结果。从左至右逐字读取数组S1,每次一个字符。根据当前字符的内容,进行如下操作:
1、当前字符为操作对象(数字或字母),直接输出到S2
2、当前字符为'(',将其压栈
3、当前字符为')',则弹出堆栈中最上的'('之前的所有运算符并输出到S2,然后从删除堆栈中最上的'('
4、当前字符为运算符,则依次弹出堆栈中优先级大于或等于当前运算符的优先级的运算符,再将当前运算符压栈
5、如果到达输入字符串S1的末尾,则弹出堆栈中剩下的所有运算符。
*/ 
#include <cstdio>
#include <cstring>
#include <stack>
#include <cctype>
#include <cstdlib>
using namespace std;
char str[1005];
/*
bool pri(char a,char b)
{
    if((a=='+'||a=='-')&&(b=='*'||b=='/'))
        return false;
    return true;
}
*/
const char ch[6][6]=
{ 
    {'>','>','<','<','<','>'},//栈顶和新输入的比较 
    {'>','>','<','<','<','>'},
    {'>','>','>','>','<','>'},
    {'>','>','>','>','<','>'},
    {'<','<','<','<','<','='},
    {'>','>','>','>',' ','>'}
};
int sign(char ch)
{
	switch(ch)
	{
		case '+' : return 0;
		case '-'  : return 1;
		case '*'  : return 2;
		case '/'  : return 3;
		case '('  : return 4;
		case ')'  : return 5;
		//default : exit(-1);
	}
}
bool pri(char a, char b)
{
	if(ch[sign(a)][sign(b)]=='>'||ch[sign(a)][sign(b)]=='=')
        return true;
    return false;
}
int main()
{
    int i,j,k,T;
    scanf("%d%*c",&T);
    while(T--)
    {
        stack <char> s;
        memset(str,0,sizeof(str));
        gets(str);
        int len = strlen(str);
        s.push(str[len-1]);//等号入栈 
        for(i=0;i<len-1;i++)
        {
            if(isdigit(str[i]))
            {
                //int pos1=strchr(str,'.')-str;
                /*
                使用strchr时,先定义一个字符型指针ptr, 
                if(ptr)(即存在)才 int pos1=strchr(str,'.')-str;
                否则,不可使用
                */ 
                j=i+1;
                while(isdigit(str[j])||str[j]=='.')
                    j++;
                for(k=i;k<=j-1;k++)
                    printf("%c",str[k]);
                putchar(' ');
                i=j-1;//不是 i=j,因为i还要自增 
            }                          
            else if(str[i]=='(')
                s.push(str[i]);                
            else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
            {    
                if(s.empty())
                    s.push(str[i]);                        
                while(pri(s.top(),str[i])&&s.size()!=1)//不处理最后的等号 
                {
                    printf("%c ",s.top());
                    s.pop();
                }
                s.push(str[i]);                                      
            }
            else if(str[i]==')')
            {
                while(s.top()!='('&&s.size()!=1)                
                {
                    printf("%c ",s.top());
                    s.pop();
                }
                s.pop();//去掉左括号 
            }
        }
         while(!s.empty()&&s.size()!=1)
         {
            printf("%c ",s.top());
            s.pop();  
         }
        printf("=\n"); 
        //system("pause");              
    }
        return 0;
}

 

目录
相关文章
|
7月前
|
算法
NYOJ-448-寻找最大数
NYOJ-448-寻找最大数
31 0
|
人工智能 算法
|
测试技术
NYOJ 541
  最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业。但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争。
773 0
|
人工智能 测试技术
NYOJ&#160;79
拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意 的高度,但是以后每一发炮弹都不能高于等于前一发的高度。
960 0
NYOJ 113
1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int pos=-1; 8 string s; 9 while(getline(cin,s)) 10 { 11 while((pos=s.
682 0
|
人工智能
NYOJ 55
  懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 小明很想吃果子,正好果园果子熟了。在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
955 0
|
网络协议
NYOJ 8
  一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);1.
794 0
|
人工智能
NYOJ 461
  Fibonacci数列(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述 数学神童小明终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
724 0