трассировка стека в коде - PullRequest
0 голосов
/ 18 апреля 2011

Мне было интересно, как добавить трассировку в стек этого кода, которая преобразует инфикс в постикс для выражений.

class Node  {
    public Object data;
    public Node next;
    public Node () {
       data =' ';  next = null; }
    public Node (Object val) {
       data = val;  next = null; }
}

public class LinkStack {
    private Node top;
    public LinkStack() {
        top = null; }
    public boolean empty(){
        return top == null; }


    public boolean full(){
        return false;
    }
public void push(Object e){
        Node tmp = new Node(e);
        tmp.next = top;
        top = tmp;
    }
public Object pop(){

    Object e =  top.data;
    top = top.next;
    return e;
}
public Object peek(){

    Object e =  top.data;

    return e;
}


public void matching(String x)
{   
    LinkStack S=new LinkStack();

    for(int i=0;i<x.length();i++)
    {
        char c=x.charAt(i);
        if(c=='(')
            S.push(c);
        else
        {
            if(c==')')
            if(S.empty())
                System.out.println("NOT MATCHING !!!");
            else
                S.pop();
        }
    }
    if(!S.empty())
        System.out.println("NOT MATCHING !!!");
    else
        System.out.println("MATCHING !!!");
}
public void Evaluation(String x)
{

    LinkStack S=new LinkStack();
    for(int i=0;i<x.length();i++)
    {
        char c=x.charAt(i);
        String s="0"+c;

        if(c=='+')
        {
            int z=Integer.parseInt((String)S.pop())+Integer.parseInt((String)S.pop());
            S.push(Integer.toString(z));
        }
        else if(c=='*')
        {
            int z=Integer.parseInt((String)S.pop())*Integer.parseInt((String)S.pop());
            S.push(Integer.toString(z));

        }
        else if(c=='/')
        {   int u=Integer.parseInt((String)S.pop());

            int z=Integer.parseInt((String)S.pop())/u;
            S.push(Integer.toString(z));

        }
        else if(c=='-')
        {   int u=Integer.parseInt((String)S.pop());
            int z=Integer.parseInt((String)S.pop())-u;
            S.push(Integer.toString(z));
        }
        else
        S.push(s);
    }
    System.out.println("THE POSTFIX = "+x);
    System.out.println("THE RESULT = "+S.pop());
}
public void postfix(String x)
{
    String output="";
    LinkStack S=new LinkStack();
    for(int i=0;i<x.length();i++)
    {
        char c=x.charAt(i);

        if(c==('+')||c==('*')||c==('-')||c==('/'))
            {while(!S.empty() && priority(S.peek())>= priority(c))
                output+=S.pop();
            S.push(c);
            System.out.println(output);
            }
        else if(c=='(')
        {
            S.push(c);
        }
        else if(c==')')
        {
            while(!S.peek().equals('('))
                    output+=S.pop();
            S.pop();
            System.out.println(output);
        }
        else
        {
            output+=c;
            System.out.println(output);
        }
    }
    while(!S.empty())
        output+=S.pop();
    System.out.println("THE INFIX = "+x);
    System.out.println("THE POSTFIX = "+output);
}
public int priority(Object x)
{
    if(x.equals('+')||x.equals('-'))
        return 1;
    else if(x.equals('*')||x.equals('/'))
        return 2;
    else
        return 0;
}

public static void main(String args[])
{


    LinkStack s=new LinkStack();
    s.postfix("x*y–z+(a–c/d)");
    System.out.println("------------------------------------------");
    s.matching("x*y–z+(a–c/d)");
    System.out.println("------------------------------------------");
}
}

1 Ответ

0 голосов
/ 18 апреля 2011

Я очень хочу следить за содержимым стека на протяжении всего преобразования

Для этого нет ракетостроения.

Просто добавьте System.err.println(...) звонкив соответствующих местах.Или, если вы делали это в производственном коде (не дай бог!), Вы могли бы использовать Logger вместо System.err.


(Для записи, термин «трассировка стека»)обычно означает трассировку стека вызовов программы, а не трассировку того, что происходит с некоторой структурой данных стека для конкретного приложения. Возможно, в следующий раз вы захотите выбрать свою терминологию немного более тщательно.)

...