您的位置:首页 > 其它

NYOJ 257 郁闷的C小加(一)

2012-08-05 21:10 218 查看

郁闷的C小加(一)

时间限制:1000 ms | 内存限制:65535 KB
难度:3

描述
我们熟悉的表达式如a+b、a+b*(c+d)等都属于中缀表达式。中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2。同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operand。ACM队的“C小加”正在郁闷怎样把一个中缀表达式转换为后缀表达式,现在请你设计一个程序,帮助C小加把中缀表达式转换成后缀表达式。为简化问题,操作数均为个位数,操作符只有+-*/ 和小括号。

输入第一行输入T,表示有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个表达式。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。并且输入数据不会出现不匹配现象。输出每组输出都单独成行,输出转换的后缀表达式。样例输入
2
1+2
(1+2)*3+4*5

样例输出
12+
12+3*45*+


/* 功能Function Description:     NYOJ-257  中缀式变后缀式
开发环境Environment:             DEV C++ 4.9.9.1
技术特点Technique:
版本Version:
作者Author:                   可笑痴狂
日期Date:                     20120805
备注Notes:
*/

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stack>
using namespace std;
char precede(char s,char z)//判断算术符的优先级*
{
if(s=='+'||s=='-')
{
if(z=='*'||z=='/'||z=='(')
return '<';
else
return  '>';
}
if(s=='*'||s=='/')
{
if(z=='(')
return '<';
else
return '>';
}
/*
if(s=='('||s=='#')     //对于‘#’可以不用判断,因为下边会在栈顶出现‘#’而且当前读入的也为‘#’时候跳出循环
{
if(s=='('&&z==')'||s=='#'&&z=='#')
return '=';
else
return '<';
}
*/
if(s=='('&&z==')')
return '=';
else
return '<';
}

int main()
{
int n,len,i;
char a[1005];
scanf("%d",&n);
while(n--)
{
stack<char> Optr;
memset(a,0,sizeof(a));
Optr.push('#');
scanf("%s",a);
len=strlen(a);
a[len]='#';
for(i=0;i<=len;)
{
if(a[i]=='#'&&Optr.top()=='#')
break;
if(a[i]>='0'&&a[i]<='9'||a[i]=='.')     //如果是运算数直接输出
{
printf("%c",a[i]);
i++;
}
else
{
switch(precede(Optr.top(),a[i]))
{
case '<':
Optr.push(a[i]);
i++;
break;
case '=':                        //说明括号或#号成对出现,弹出栈顶的‘(’或者‘#’,括号不用输出
Optr.pop();
i++;
break;
case '>':                        //输出栈顶元素并弹出栈顶元素
printf("%c",Optr.top());
Optr.pop();
break;
}
}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: