后缀表达式 NYOJ 257
一个算术表达式,含有数字(为简化处理,数字只有一位),运算符:+、-、*,以及括号,求表达式的值。
给出的表达式是一般我们见到的中缀表达式,即运算符位于操作数之间。如果把中缀表达式转化为后缀表达式,那么对后缀表达式求值将会很方便。
后缀表达式特点:
1.操作符位于操作数之后;
2.没有括号;
3.运算符没有优先级。
中缀表达式转化为后缀表达式的步骤:
1.初始化一个空操作符栈和空结果字符串;
2.从前到后读取中缀表达式的字符,如果是操作数,加到结果字符串后面;
3.如果是操作符,分两种情况入栈:
a.如果待入栈操作符优先级大于栈顶操作符,直接入栈;
b.如果待入栈操作符优先级小于或等于栈顶操作符,栈顶操作符加到结果字符串后面;重复b过程直到遇到前括号‘(’或栈顶操作符优先级比待入栈操作符小,待入栈操作符入栈。
4.如果是前括号‘(’,直接入栈;
5.如果是后括号,将栈中操作符依次弹出,直至遇到一个前括号‘(’结束。前括号出栈。
最后结果字符串就是后缀表达式。
后缀表达式求值的步骤:
1.初始化一个空操作数栈;
2.从前到后读取后缀表达式字符。如果是操作数直接入栈。如果读到一个操作符@,弹出栈顶元素a和新的栈顶元素b,执行b @ a,将结果压入栈中;
3.最后栈中只剩下一个元素,即表达式的值。
郁闷的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*+
1 #include<stdio.h> 2 #include<string.h> 3 #include<stack> 4 using namespace std; 5 6 char a[1010]; 7 char b[1010]; 8 stack<char>s; 9 10 int fun(char x) 11 { 12 switch(x) 13 { 14 case '+': 15 case '-':return 1; 16 case '*': 17 case '/':return 2; 18 case '(':return 0; 19 default :return -1; 20 } 21 } 22 23 24 int main() 25 { 26 int i,j,t,m; 27 s.push('#'); 28 scanf("%d",&t); 29 while(t--) 30 { 31 j=0; 32 scanf("%s",a); 33 memset(b,0,sizeof(b)); 34 m=strlen(a); 35 for(i=0;i<m;i++) 36 { 37 if(a[i]>='0'&&a[i]<='9'||a[i]=='.') b[j++]=a[i]; 38 else if(a[i]=='(') s.push(a[i]); 39 else if(a[i]==')') 40 { 41 while(s.top()!='(') 42 { 43 b[j++]=s.top(); 44 s.pop(); 45 } 46 s.pop(); 47 } 48 else 49 { 50 while(fun(s.top())>=fun(a[i])) 51 { 52 b[j++]=s.top(); 53 s.pop(); 54 } 55 s.push(a[i]); 56 } 57 58 } 59 while(s.top()!='#') 60 { 61 b[j++]=s.top(); 62 s.pop(); 63 } 64 b[j]='\0'; 65 puts(b); 66 } 67 return 0; 68 }