我正在实施调车场算法,但在处理括号时遇到了麻烦。不过,它适用于非分组表达式。这是我没有括号检测的情况:
public void makePost(String e)
{
String[] arr = e.split("");
for(int i = 0; i < arr.length; i++)
{
if(arr[i].equals(" "))
{
continue;
}
Operator o = OperatorList.getOpMap().get(arr[i]);
if(o == null){
postfix += " " + arr[i];
continue;
}
if(ops.isEmpty()){
ops.push(o);
continue;
}
else
{
while((!ops.isEmpty() && (ops.peek().getPresedence() <= o.getPresedence()))){
postfix += " " + ops.pop();
}
ops.push(o);
continue;
}
}
while(!ops.isEmpty())
{
postfix += " " + ops.pop();
}
postfix = postfix.trim();
}
ops 是保存 Operator 对象的堆栈。有两种类型的运算符,函数(+,-,*等)和Parans(“(”,“[”))。您如何为此添加括号处理?每次尝试,我似乎都无法理解正常工作
这是我尝试过的:
public void makePost(String e)
{
String[] arr = e.split("");
for(int i = 0; i < arr.length; i++){
if(arr[i].equals(" ")){
continue;
}
Operator o = OperatorList.getOpMap().get(arr[i]);
if(o == null){
postfix += " " + arr[i];
continue;
}
if(ops.isEmpty()){
ops.push(o);
continue;
}
else
{
if(o.isParan())
{
Paran p = new Paran(o.toString());
if(p.isOpen())
{
ops.push(o);
System.out.println(ops);
continue;
}else{
while(!ops.isEmpty()){
if(ops.peek().isParan()){
Paran n = new Paran(o.toString());
if(n.isOpen()){
ops.pop();
break;
}
}
postfix += " " + ops.pop();
}
continue;
}
}
while((!ops.isEmpty() && (ops.peek().getPresedence() <= o.getPresedence()))){
postfix += " " + ops.pop();
}
ops.push(o);
continue;
}
}
while(!ops.isEmpty())
{
postfix += " " + ops.pop();
}
postfix = postfix.trim();
}
我怀疑while循环条件不好,但我不知道有什么合适的替换。它继续到无穷大。这是我拥有的最干净的实现。基本上它应该做的是当它遇到一个左括号时,将它压入堆栈。当它碰到一个闭合的时,将堆栈中的所有内容弹出到输出上,直到它碰到左括号。然后它应该中断,并继续下一个令牌。
if(o.isParan())
{
Paran p = new Paran(o.toString());
if(p.isOpen())
{
ops.push(o);
System.out.println(ops);
continue;
}else{
while(!ops.isEmpty()){
if(ops.peek().isParan()){
Paran n = new Paran(o.toString());
if(n.isOpen()){
ops.pop();
break;
}
}
postfix += " " + ops.pop();
}
continue;
}
编辑:添加了我的尝试