Я реализую алгоритм маневровой станции, и у меня возникают проблемы с обработкой скобок. Однако он отлично работает с несгруппированными выражениями. Вот что у меня есть без обнаружения скобок:
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. Есть два типа операторов: функции (+,-,* и т. д.) и параны ("(","["). Как бы вы добавили к этому обработку скобок? Каждый раз, когда я пытаюсь, я не могу понять работать правильно
Вот что я пробовал:
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;
}
РЕДАКТИРОВАТЬ: добавил мою попытку
postfix += " " + ops.pop()
? или оба? - person user2570465   schedule 05.01.2014