NYOJ 257 中缀表达式表示成后缀表达式

原创 2012年03月24日 11:11:52

       话说这道题代码那个丑陋啊,,写出来我自己都不想再看第二遍啊。。。看了看聪神的代码,还消耗我3个NYOJ币啊,,更扯得是,聪神的代码我看不懂啊,,,,卧槽。。。这道题不再多说了,数据结构上有详细的介绍,主要就是输入的时候巧妙利用sscanf()函数就可以了。。题目:

郁闷的C小加(一)

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

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

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

#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
using namespace std;
struct oper{
  char op;
  int level;
}p;
int fun(char cc){
  if(cc=='+'||cc=='-')
	  return 1;
  else if(cc=='*'||cc=='/')
	  return 2;
  else if(cc=='(')
	  return 3;
  else if(cc==')')
	  return 0;
}
int main(){
  int numcase;
  scanf("%d",&numcase);
  while(numcase--){
    string str;
	cin>>str;
	int len=str.size(),pos=0,ll=0,num=0;
	char ch;
	stack<oper> ss;
	p.op=' ';p.level=0;ss.push(p);
	while(pos<len){
		if(str[pos]<='9'&&str[pos]>='0'){
		  sscanf(&str[pos],"%d%n",&num,&ll);
		  printf("%d",num);
		  pos+=ll;
		}
		else{
		  sscanf(&str[pos],"%c%n",&ch,&ll);
		  pos+=ll;p.op=ch;p.level=fun(ch);
		  if(p.op==')'){
			  while(ss.top().op!='('){
				  printf("%c",ss.top().op);
				  ss.pop();
			  }
			  ss.pop();
		  }
		  else if(p.level>ss.top().level||ss.top().op=='(')
		  ss.push(p);
		  else{
			  while(p.level<=ss.top().level&&ss.top().op!='('){
				  printf("%c",ss.top().op);
				  ss.pop();
			  }
			  ss.push(p);
		  }
		}
	}
	while(!ss.empty()){
		printf("%c",ss.top().op);
		ss.pop();
	}
	printf("\n");
  }
  return 0;
}


后缀表达式(4)-——中缀表达式到后缀表达式的转换,递归实现

本篇是介绍的是后缀表达式最难,也是最基本的一个问题。即如何将一个中缀表达式转化为后缀表达式。在网上可以找到许多非递归实现的示例代码,它们比本节介绍的代码要简洁且高效,可是不利于理解。本节舍近求远,介绍...
  • hedan2013
  • hedan2013
  • 2016年10月16日 22:46
  • 546

Scala从零开始:中缀表示法和后缀表示法

在Scala中有很多为了方便而创造的语法规则,使用这些语法规则可以创建更简洁的语法,使编程更加有效。今天我们来看两个常用的语法规则,即中缀表示法(infix syntax)和后缀表示法(suffix ...
  • doggie_wangtao
  • doggie_wangtao
  • 2014年03月19日 23:44
  • 3185

利用栈将中缀表达式转换成后缀表达式,并将得到的后缀表达式求值

头文件:函数的声明 #include #include #include #define STACKSIZE 100 #define MAXSIZE 50 typedef char Ele...
  • qaz3171210
  • qaz3171210
  • 2015年02月10日 00:00
  • 1503

中缀表达式转后缀表达式求值(模板)

///中缀表达式转后缀表达式 #include #include const int MAX=100; using namespace std; char pp[MAX];//存储转换后的后缀表达式 ...
  • xiaosshhaa
  • xiaosshhaa
  • 2016年09月29日 21:07
  • 342

前缀表达式、中缀表达式、后缀表达式

中缀表达式就是我们日常看到的数学表达式:比如(2+4)*2,对于人类来说很直观,但是对于计算机而言,这种表达式很不容易理解。于是就有了前缀表达式和后缀表达式。前缀表达式前缀表达式是指将操作符放在前面,...
  • zdavb
  • zdavb
  • 2016年04月06日 22:13
  • 3802

前缀、中缀、后缀表达式学习

前言 最近做面试题的时候碰到了前缀、中缀、后缀表达式的问题,题目如下: 表达式“X=A+B*(C-D)/E”的后缀表达式? 看到这里有点蒙,于是赶紧google,记录一下学习新得吧 概述 ...
  • zinss26914
  • zinss26914
  • 2013年09月06日 13:29
  • 6292

5-21 求前缀表达式的值 (25分)

5-21 求前缀表达式的值 (25分)算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3∗(7−4)+8/42+3*(7-4)+8/4的前缀...
  • Changxing898
  • Changxing898
  • 2016年08月29日 10:38
  • 2536

中缀表达式、后缀表达式及前缀表达式-学习笔记

四则运算表达式求值: 20世纪50年代波兰逻辑学家janlukasiewicz想到了一种不需要括号的后缀表达式法,可以称为逆波兰表示(RPN).reverse polish notation . ...
  • long636
  • long636
  • 2015年11月21日 21:58
  • 827

用堆栈把中缀表达式转化为后缀表达式

参考文章:http://www.cnblogs.com/mygmh/archive/2012/10/06/2713362.html 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出...
  • conjimmy
  • conjimmy
  • 2014年12月13日 10:32
  • 3913

1、后缀表达式,以及中缀转后缀算法的思考

所谓运算中的中缀表达式,就是形如a+b这样,运算符号在参与运算的两个量的中间。按照这个逻辑那么后缀表达式也就很好理解了:ab+。 后缀表达式又称逆波兰表达式,这个表达式有特别的用途,可以配合栈(sta...
  • heruozhi
  • heruozhi
  • 2015年04月02日 18:26
  • 708
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NYOJ 257 中缀表达式表示成后缀表达式
举报原因:
原因补充:

(最多只允许输入30个字)