Я реализую алгоритм шунтирования, и у меня возникают проблемы с скобками. Тем не менее, он отлично работает с негрупповыми выражениями. Вот что у меня есть без обнаружения скобки:Не удалось добавить обработку скобок в моей реализации Shunting yard
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 является стек, который содержит объекты Оператора. Есть два типа операторов: функции (+, -, * и т. Д.) И 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();
}
Я подозреваю, что состояние в то время как петля плохо, но я не знаю ни одной правильной замены Это продолжается до бесконечности Это было чистая реализация, которую я имел. В основном то, что она должна делать, - это когда она встречает открытую круглую скобку, толкает ее в стек. Когда она попадает в закрытую, выталкивайте все из стека на вывод, пока он не попадет в открытую круглую скобку. должен сломаться и перейти к следующему знаку.
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;
}
EDIT: добавлена моя попытка
Как бы то ни было, этот вопрос представляется «пожалуйста, сделайте мою домашнюю работу для меня». Я подозреваю, что он получит лучший прием, если вы покажете, что вы попробовали, и объясните, почему вы думаете, что он должен работать ... – GreenAsJade
Это не домашнее задание, но я могу добавить свои попытки –
Я думаю, что это добавит доверия к вопросу, чтобы показать что-то из того, что вы пытались, что не сработало - да, пожалуйста. Вы также можете очистить многие другие вопросы StackOverflow о Shunting Yard :). Прямо сейчас, в верхней части списка справа от меня, вопрос о сохранении парнеров в Shunting Yard;) – GreenAsJade