2011-04-17 82 views
0

我想知道如何將跟蹤添加到此代碼的堆棧中,該代碼將中綴轉換爲表達式的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("------------------------------------------"); 
} 
} 
+2

這是什麼語言?看起來像C#或Java。無論如何,**不要使用公共字段**。 – 2011-04-17 23:19:15

+0

創建一個新的異常,不扔它,只是printStackTrace ...如果這是你想要的。 – govi 2011-04-17 23:58:29

+0

我非常想在整個轉換過程中遵循堆棧的內容 – 2011-04-18 00:32:02

回答

0

我非常想跟隨棧的內容在整個轉換

有沒有火箭科學地解決了這個。

只需在相關位置添加System.err.println(...)電話即可。或者,如果您是在生產代碼(天堂禁止!)中執行此操作,則可以使用Logger而不是System.err


(根據記錄,術語「堆棧跟蹤」通常是指一個程序調用堆棧,而不是發生了什麼應用程序特定的堆棧數據結構的一絲一絲的,你可能想選擇你的術語下次更仔細一點。)