中缀转后缀需要遵守以下规则
1、操作数:直接输出
2、“(”:直接入栈
3、“)”:”将“(”以前的直接输出,并将“)”出栈(不输出)
4、运算符+-*/:将优先级不小于该运算符的操作符出栈,最后将该运算符入栈
5、最后将栈中的元素依次弹出
6、优先级*/大于+-大于()
class InToSuf
{
public List<String> solve(String[] op)//求op代表的中缀表达式的后缀表达式
{
Stack<String> stack=new Stack<>();
List<String> h=new ArrayList<>();
String temp="";
for(int i=0;i<op.length;i++)
{
if(!isOpfu(op[i]))
{
h.add(op[i]);
continue;
}
if(op[i].equals("("))
{
stack.push(op[i]);
continue;
}
if (op[i].equals(")"))
{
temp=stack.pop();
while(!temp.equals("("))
{
h.add(temp);
temp=stack.pop();
}continue;
}
while(!stack.isEmpty())
{
temp=stack.peek();
if(judge(temp, op[i])==1)
{
h.add(temp);
stack.pop();
}
else break;
}
stack.push(op[i]);
}
while(!stack.isEmpty())
h.add(stack.pop());
return h;
}
private int judge(String a,String b)//比较操作符a、b的大小,若a>=b则返回1,否则返回-1
{
if(a.equals("*") || a.equals("/"))
return 1;
if(a.equals("+") || a.equals("-"))
{
if(!b.equals("*") && !b.equals("/"))
return 1;
}
return -1;
}
private boolean isOpfu(String a)//判断a是否是操作符
{
if(a.equals("+")||a.equals("-")||a.equals("*")||a.equals("/")
||a.equals("(")||a.equals(")"))
return true;
return false;
}
}
求后缀表达式的值
1、操作数:入栈
2、操作符:将栈顶的两个元素弹出,先弹出的在运算符右边,后弹出的在左边,计算结果,并将结果入栈
3、最后剩余的元素就为表达式的值
class Calculate
{ //后缀表达式用list存放
double calculate(List<String> suffix)
{
Stack<String> stack=new Stack<>();
String temp="";
for(int i=0;i<suffix.size();i++)
{
temp=suffix.get(i);
if(isOpfu(temp))
{
String r=stack.pop();
String l=stack.pop();
String f=count(l, r, temp)+"";
stack.push(f);
}
else
stack.push(temp);
}
return Double.valueOf(stack.pop());
}
private boolean isOpfu(String a)//判断a是否是操作符
{
if(a.equals("+")||a.equals("-")||a.equals("*")||a.equals("/")
||a.equals("(")||a.equals(")"))
return true;
return false;
}
private double count(String l,String r,String op)//根据运算符计算两个数的结果
{
double x=Double.valueOf(l);
double y=Double.valueOf(r);
switch (op) {
case "+":
return x+y;
case "-":
return x-y;
case "*":
return x*y;
default:
return x/y;
}
}
}