codeup--22071(改)
2016-08-04 20:25
211 查看
题目描述
我们熟悉的表达式如a+b、a+b*(c+d)等都属于中缀表达式。
中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2。
同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operand。
前缀表达式则是操作符在两个操作数之前:operand num1 num2。
现在试图输入一个中缀表达式分别转换为后缀表达式。现在请你设计一个程序完成题目要求。
为简化问题,操作数均为个位数,操作符只有+-*/ 和小括号
输入
第一行输入T,表示有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个表达式。这个表达式里只包含+-*/与小括号
这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。并且输入数据不会出现不匹配现象。
输出
每组输出都单独成行,分别输出转换的后缀表达式和前缀表达式。
样例输入
2
1+2
(1+2)*3+4*5
样例输出
12+
12+3*45*+
我们熟悉的表达式如a+b、a+b*(c+d)等都属于中缀表达式。
中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2。
同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operand。
前缀表达式则是操作符在两个操作数之前:operand num1 num2。
现在试图输入一个中缀表达式分别转换为后缀表达式。现在请你设计一个程序完成题目要求。
为简化问题,操作数均为个位数,操作符只有+-*/ 和小括号
输入
第一行输入T,表示有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个表达式。这个表达式里只包含+-*/与小括号
这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。并且输入数据不会出现不匹配现象。
输出
每组输出都单独成行,分别输出转换的后缀表达式和前缀表达式。
样例输入
2
1+2
(1+2)*3+4*5
样例输出
12+
12+3*45*+
#include <stdio.h> #include <ctype.h> #include <iostream> #include <cstring> using namespace std; #define maxsize 500 class mystack { public: char data[maxsize+1];//栈 int top;//栈顶指针 mystack(){top=-1;}//栈为空 bool isEmpty(){return top<0? true: false;}//判断栈是否为空 bool isFull(){return top<maxsize-1? false: true;}//判断栈是否已满 void push(char x)//入栈 { if(isFull()) return; else { top++;//栈顶指针加一 data[top]=x;//数据如栈 } } bool pop(char &x)//出栈,并用x返回出栈的值 { if(isEmpty()) return false; else { x=data[top];//数据先出栈 top--;//栈顶指针减一 } } void clean(){top=-1;}//清空栈 char getTop(){if(!isEmpty())return data[top];else return '\0';}//返回栈顶元素 void create()//创建栈 { //函数暂时保留 } }; //确定运算符优先级的函数优先级 /*栈内*/ int s_level(char ch) { switch(ch) { case '(':return 1;break; case ')':return 6;break; case '+':return 2;break; case '-':return 2;break; case '*':return 4;break; case '/':return 4;break; } } /*栈外*/ int c_level(char ch) { switch(ch) { case '(':return 6;break; case ')':return 1;break; case '+':return 3;break; case '-':return 3;break; case '*':return 5;break; case '/':return 5;break; } } int main() { // freopen("in.txt","r",stdin); mystack s1,s2;//符号栈和数据栈 int n; int flag=0; cin>>n; for(int i=0;i<n;i++) { string str;//用于保存表达式 cin>>str; //只是中缀转后缀 for(int j=0;j<str.length();j++) { //是数字就直接输出 if(isalnum(str[j])) cout<<str[j]; else if(s1.isEmpty())//如果栈为空就直接进栈 s1.push(str[j]); else//栈不为空的时候就进行比较 { while(!s1.isEmpty()&&s_level(s1.getTop())>=c_level(str[j])) { char x; //过滤括号 if(s1.getTop()=='('&&str[j]==')') { s1.pop(x);flag=1;break; }//if //如果栈内的操作符比栈外的操作符优先级高就出栈 else {s1.pop(x);cout<<x;} }//while if(flag==0) s1.push(str[j]); f c972 lag=0; }//else }//for while(!s1.isEmpty()) { char x; s1.pop(x); cout<<x; } cout<<endl; s1.clean(); }//for return 0; }
相关文章推荐
- 《Applications=Code+Markup》读书札记(1)——一个简单的 WPF 程序
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) B - Save the problem!
- codeup27990 军事机密
- 《算法笔记》3.1习题 codeup problem1814 剩下的树
- 【大数取模】HDOJ-1134、CODEUP-1086
- codeforces MemSQL Start[c]UP 2.0 - Round 1 B. 4-point polyline
- 字符串处理 [codeup 5901] 回文串
- Google Code Jam 2010 Round 1B Problem B. Picking Up Chicks
- 《算法笔记》3.1习题 codeup problem 1932 统计同成绩学生人数
- codeforces Paying up 题解
- google code jam exercise——Picking Up Chicks
- codeup-1934题解
- 推荐阅读《Applications = Code + Markup》
- Codeforces Round #462 (Div. 2) D. A Determined Cleanup
- 推荐阅读《Applications = Code + Markup》
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) C - Ordering Pizza
- 日期差值 codeup 1928
- Git - error: RPC failed; result=22, HTTP code = 401 fatal: The remote end hung up unexpectedly
- Code analysis of Hadoop v0.1.0 (1) Setting up the environment
- 声明中"AutoEventWireup"、"Codebehind"、"Inherits"分别表示什么意思?