#java #string #recursion
#java #строка #рекурсия
Вопрос:
Итак, у меня есть эта функция EDIT: вся программа в соответствии с запросом
//This is a java program to construct Expression Tree using Infix Expression
import java.io.*;
public class Infix_Expression_Tree
{
public static void main(String args[]) throws IOException
{
String result="";
File vhod = new File(args[0]);
try{
BufferedReader reader = new BufferedReader(new FileReader(vhod));
Tree t1 = new Tree();
String a = reader.readLine();
t1.insert(a);
t1.traverse(1,result);
System.out.println("rez " result);
ch = reader.readLine();
}catch(IOException e){
e.printStackTrace();
}
}
}
class Node
{
public char data;
public Node leftChild;
public Node rightChild;
public Node(char x)
{
data = x;
}
public void displayNode()
{
System.out.print(data);
}
}
class Stack1
{
private Node[] a;
private int top, m;
public Stack1(int max)
{
m = max;
a = new Node[m];
top = -1;
}
public void push(Node key)
{
a[ top] = key;
}
public Node pop()
{
return (a[top--]);
}
public boolean isEmpty()
{
return (top == -1);
}
}
class Stack2
{
private char[] a;
private int top, m;
public Stack2(int max)
{
m = max;
a = new char[m];
top = -1;
}
public void push(char key)
{
a[ top] = key;
}
public char pop()
{
return (a[top--]);
}
public boolean isEmpty()
{
return (top == -1);
}
}
class Conversion
{
private Stack2 s;
private String input;
private String output = "";
public Conversion(String str)
{
input = str;
s = new Stack2(str.length());
}
public String inToPost()
{
for (int i = 0; i < input.length(); i )
{
char ch = input.charAt(i);
switch (ch)
{
case ' ':
gotOperator(ch, 2);
break;
case '*':
gotOperator(ch,1);
break;
case '/':
gotOperator(ch, 3);
break;
case '(':
s.push(ch);
break;
case ')':
gotParenthesis();
//s.pop();
break;
default:
//gotOperator(ch, 0);
//break;
output = output ch;
}
}
while (!s.isEmpty())
output = output s.pop();
//System.out.println("to je output iz inToPost " output);
return output;
}
private void gotOperator(char opThis, int prec1)
{
while (!s.isEmpty())
{
char opTop = s.pop();
if (opTop == '(')
{
s.push(opTop);
break;
} else
{
int prec2;
if (opTop == ' ')
prec2 = 2;
else if(opTop=='*')
prec2=1;
else
prec2 = 3;
if (prec2 <= prec1)
{
s.push(opTop);
break;
} else
output = output opTop;
}
}
s.push(opThis);
}
private void gotParenthesis()
{
while (!s.isEmpty())
{
char ch = s.pop();
if (ch == '(')
break;
else
output = output ch;
}
}
}
class Tree
{
private Node root;
public Tree()
{
root = null;
}
public void insert(String s)
{
Conversion c = new Conversion(s);
s = c.inToPost();
Stack1 stk = new Stack1(s.length());
s = s "#";
int i = 0;
char symbol = s.charAt(i);
Node newNode;
while (symbol != '#')
{
if (symbol >= '0' amp;amp; symbol <= '9' || symbol >= 'A'
amp;amp; symbol <= 'Z' || symbol >= 'a' amp;amp; symbol <= 'z')
{
newNode = new Node(symbol);
stk.push(newNode);
} else if (symbol == ' ' || symbol == '/'
|| symbol == '*')
{
Node ptr1=null;
Node ptr2=null;
//if(!stk.isEmpty()){
ptr1 = stk.pop();
if(!stk.isEmpty()){
ptr2 = stk.pop();
}
//}
newNode = new Node(symbol);
newNode.leftChild = ptr2;
newNode.rightChild = ptr1;
stk.push(newNode);
}
/*else if(symbol=='/'){
Node ptr = stk.pop();
newNode = new Node(symbol);
newNode.leftChild = ptr;
newNode.rightChild=null;
stk.push(newNode);
}*/
symbol = s.charAt( i);
}
root = stk.pop();
}
public void traverse(int type,String result)
{
System.out.println("Preorder Traversal:- ");
preOrder(root,result);
}
private void preOrder(Node localRoot, String result)
{
if(root==null){
return;
}
if (localRoot != null)
{
if(localRoot.data == '/'){
preOrder(localRoot.leftChild,result);
result=result localRoot.data;
//StringBuilder stringBuilder1 = new StringBuilder();
//stringBuilder1.append(result).append(localRoot.data);
System.out.println(result);
//localRoot.displayNode();
preOrder(localRoot.rightChild,result);
return;
}else{
//System.out.println("trenutni root je" );
//localRoot.displayNode();
result=result localRoot.data;
// StringBuilder stringBuilder1 = new StringBuilder();
//stringBuilder1.append(result).append(localRoot.data);
System.out.println(result);
preOrder(localRoot.leftChild,result);
//result=result localRoot.data;
//System.out.print(root.data);
preOrder(localRoot.rightChild,result);
//System.out.print(root.data);
//preOrder(localRoot.rightChild);
return;
}
}
}
}
моя проблема с этим заключается в том, что с localRoot.DisplayNode() я получаю желаемый результат. Но когда я добавляю то же самое к результату строки, он добавляет данные, пока я не доберусь до листа дерева (у листа нет левого / правого дочернего элемента), поэтому он возвращается к предыдущему рекурсивному вызову и переходит к правому дочернему элементу, здесь где-то лист (из которого мы вернулись) не находится в строке больше нет. Как мне это исправить?
Строка определяется в основном методе
Комментарии:
1. Не могли бы вы, пожалуйста, опубликовать код всего класса? Мы не можем видеть определение для
root
, иresult
. Также было бы полезно посмотреть, какNode.leftChild
определяются иNode.rightChild
определяются. Пожалуйста, опубликуйте также свой основной метод с вызовомpreOrder()
.2. Кроме того, пожалуйста, точно опишите, что
preOrder()
вы должны делать. Приведите пример входных данных и чего вы ожидаете от этого метода.3. Я обновил сообщение, я добавил целую программу, чтобы вы могли видеть, откуда берется материал
4. Просто примечание, какова ваша главная цель? Вы хотите анализировать выражения? Если это так, я бы рекомендовал использовать библиотеку синтаксического анализа. Я лично использую ANTLR4, что потрясающе, но есть и другие. Простую грамматику выражений можно найти здесь . Используя ANTLR4, вы действительно можете сэкономить много времени на написание и отладку.
5. Пожалуйста, отправьте также файл входных данных.