简体   繁体   English

代码中的堆栈跟踪

[英]stack trace in code

I was wondering how I would add a trace to the stack of this code that converts infix to postix for expressions. 我不知道我怎么会一丝丝添加到该代码转换缀以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("------------------------------------------");
}
}

I am pretty much wanting to follow the contents of the stack throughout the conversion 我非常想在整个转换过程中遵循堆栈的内容

There's no rocket science solution to this. 没有火箭科学的解决方案。

Just add System.err.println(...) calls at the relevant places. 只需在相关位置添加System.err.println(...)调用即可。 Or if you were doing this in production code (heaven forbid!) you might use a Logger instead of System.err . 或者,如果您是在生产代码中执行此操作(禁止访问!),则可以使用Logger而不是System.err


(For the record, the term "stack trace" normally means a trace of a program's call stack, not a trace of what happens to some application-specific stack data structure. You might want to choose your terminology a little more carefully next time.) (为便于记录,术语“堆栈跟踪”通常是指程序调用堆栈的跟踪,而不是某些特定于应用程序的堆栈数据结构发生的跟踪。您可能希望下次更仔细地选择术语。 )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM