代码中的堆栈跟踪

时间:2011-04-17 23:16:49

标签: java stack trace prefix postfix-notation

我想知道如何在这段代码的堆栈中添加一条跟踪,将中缀转换为表达式的postix。

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 :(得分:0)

  

我非常想在整个转换过程中跟踪堆栈的内容

没有火箭科学解决方案。

只需在相关位置添加System.err.println(...)次来电即可。或者,如果您在生产代码中执行此操作(天堂禁止!),您可以使用Logger代替System.err


(对于记录,术语“堆栈跟踪”通常表示程序调用堆栈的跟踪,而不是某些特定于应用程序的堆栈数据结构的跟踪。您可能希望选择您的术语a下次再小心点了。)