数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
Hint
Author
由一般式求后缀式方法:
1.先设立一个暂时暂时存放运算符的栈;
2.若是操作数直接输出;
3(1).若是运算符,如果栈为空,当前运算符入栈;
(2)如果不为空,和栈顶元素比较,如果优先级比栈顶元素大且不是右括号,直接入栈,如果是右括号,则输出栈里面的元素直到遇到第一个左括号,并且将左括号舍弃。
(3)如果优先级小于等于栈顶元素,若栈顶元素不是左括号,则输出栈顶元素,并将当前元素入栈;如果是,直接将当前元素入栈。
4.如果遇到结束符后栈不为空,则依次输出栈顶元素直到栈空。
import java.util.Scanner;
import java.util.Stack;
public class test {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
Stack stack =new Stack();
String str = cin.nextLine();
for (int i = 0; str.charAt(i)!='#'; i ++){
if(str.charAt(i)>='a'&&str.charAt(i)<='z'){
System.out.print(str.charAt(i));
}
else if(str.charAt(i)=='('){
stack.push(str.charAt(i));
}
else if(str.charAt(i)==')'){
while(stack.peek().toString().charAt(0)!='('){
System.out.print(stack.peek());
stack.pop();
}
stack.pop();
}
else if (str.charAt(i)=='+'||str.charAt(i)=='-'){
while(!stack.empty()&&stack.peek().toString().charAt(0)!='('){
System.out.print(stack.peek());
stack.pop();
}
stack.push(str.charAt(i));
}
else if(str.charAt(i)=='*'||str.charAt(i)=='/'){
while(!stack.empty()&&stack.peek().toString().charAt(0)!='('&&(stack.peek().toString().charAt(0)=='/')){
System.out.print(stack.peek());
stack.pop();
}
stack.push(str.charAt(i));
}
}
while(!stack.empty()){
System.out.print(stack.peek());
stack.pop();
}
}
}