**
* 中缀表达式转后缀表达式
*
* 作用:将一长串计算表达式转换为计算机易于操作的字符序列,用于计算器的设计
*
* 参与转换运算符
* +-/*()^%
*
*
* 使用StringBuilder来保存转换出的后缀表达式
* 使用栈来操作运算符
*
*
* 转换原则
* 1.上述字符中()没有优先级值,+-优先级值为1,/*%优先级值为2,^优先级值为3
* 2.对于一个待计算的表达式,从左向右逐个检查每个字符
* 3.遇到数字,直接append到StringBuilder
* 4.遇到 ( 括号,直接push入栈
* 5.遇到 ) 括号,pop出栈中的操作符并append到StringBuilder中直到遇到 ( 括号,如果在栈空之前没有发现 ( 括号,抛出异常
* 6.对于其他操作符,如果栈顶是 ( ,直接push入栈
* 7.否则,如果栈顶操作符优先级值大于它,则在栈不空之前,pop出栈中的操作符并append到StringBuilder中,
* 直到遇到比它优先级小的操作符,这个比它优先级小的操作符不出栈,最后将此操作符push入栈中
* 8.检查完每一个字符后,如果栈中还有操作符,将这些操作符直接append到StringBuilder中
*
* 最后StringBuilder中保存的就是后缀表达式
* **/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class change {
public static void main(String[] args) throws IOException{
intopost itp=new intopost();
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String infix,postfix=null;
while((infix=bf.readLine())!=null){
postfix=itp.inToPost(infix);
System.out.println(postfix);
}
}
}
class intopost{
public String inToPost(String infix){
Stack<operator> sk=new Stack<operator>();
StringBuilder sb=new StringBuilder();
char[] ch=infix.toCharArray();
for(int i=0;i<ch.length;i++){
if(Character.isDigit(ch[i]))
sb.append(ch[i]);
else
operators(sb,sk,ch[i]);
}
while(!sk.isEmpty()){
sb.append(sk.pop().tmp);
}
return sb.toString();
}
//对非数字部分进行处理
public void operators(StringBuilder sb,Stack<operator> sk,Character ch){
operator chh=new operator(ch);
if(sk.isEmpty() || ch.equals('(') || sk.peek().tmp.equals('(')){
sk.push(chh);
return;
}
if(ch.equals(')')){
if(sk.isEmpty())
throw new RuntimeException();
while(!sk.peek().tmp.equals('(')){
sb.append(sk.pop().tmp);
if(sk.isEmpty())
throw new RuntimeException();
}
sk.pop();
return;
}
if(chh.RANK<sk.peek().RANK)
while((!sk.isEmpty()) && (!sk.peek().tmp.equals('(')) && chh.RANK<=sk.peek().RANK){
sb.append(sk.pop().tmp);
}
sk.push(chh);
}
}
///操作符类
class operator{
int RANK;
Character tmp;
public operator(Character ch){
this.tmp=ch;
if(ch.equals('+') || ch.equals('-'))
this.RANK=1;
if(ch.equals('*') || ch.equals('/') || ch.equals('%'))
this.RANK=2;
if(ch.equals('^'))
this.RANK=3;
}
}
//测试结果
输入 1-2*(3^6-((9-8)*6)^2*6)-8
输出 1236^98-6*2^6*-*-8-
中缀表达式转为后缀表达式
最新推荐文章于 2024-04-05 03:42:59 发布