2011-10-05 110 views
0

所以我試圖實現鏈接列表合併排序。合併排序鏈接列表java:Stackover Flow

這裏是我想要做的合併排序的類。

/** 
* CS 200 Colorado State University, Fall 2011 
*/ 

public class Member { 

private String userID; 
private String first; 
private String last; 
private EdgeStack edgeStack; 

public void sortScore(Member member){ 
    // calling a helper method 
    // this greedy method takes all the creds 
    edgeStack = sortEdgeStack(member); 
} 

private EdgeStack sortEdgeStack(Member member) 
{ 
    // our temp stacks 
    EdgeStack tempEdgeStack_A = new EdgeStack(); 
    EdgeStack tempEdgeStack_B = new EdgeStack(); 

    // our return value 
    EdgeStack result = null; 
    // storing the size of the stack 
    int sizeOfStack = member.getEdgeStack().getSize(); 
    // base case 
    if(sizeOfStack<0){ 
     return null; 
    } 
    // our true base case 
    else if(sizeOfStack==1) 
    { 
     // init stack 
     EdgeStack base = new EdgeStack(); 

     base.push(member.getEdgeStack().pop()); 
     return base; 
    } 
    else 
    { 

     // pop and store 
     for(int i = 0; i < (sizeOfStack/2); i++) 
     { 
      tempEdgeStack_A.push(member.getEdgeStack().pop()); 
     } 
     // pop and store into b 
     for(int j = (sizeOfStack/2)+1; j < sizeOfStack; j++) 
     { 
      tempEdgeStack_B.push(member.getEdgeStack().pop()); 
     } 

     tempEdgeStack_A = sortEdgeStack(member); 
     tempEdgeStack_B = sortEdgeStack(member); 
     result = merge(tempEdgeStack_A,tempEdgeStack_B); 
     return result; 
    } 
} 


private EdgeStack merge(EdgeStack tempEdgeStack_A, EdgeStack tempEdgeStack_B) { 

    EdgeStack result = new EdgeStack(); 

    // while either or 
    while(tempEdgeStack_A.getSize()> 0 || tempEdgeStack_B.getSize() > 0) 
    { 
     // if both are bigger then 0 
     if(tempEdgeStack_A.getSize()> 0 && tempEdgeStack_B.getSize() > 0) 
     { 
      if(tempEdgeStack_A.peek().getEdgeRank()<=tempEdgeStack_B.peek().getEdgeRank()) 
      { 
       // adds b to result 
       result.push(tempEdgeStack_A.pop()); 
      } 
      else 
      { 
       result.push(tempEdgeStack_B.pop()); 
      } 
     } 
     // these elses cover if A or B are > 0 but A or B is also less then or equal too 0; 
     else if(tempEdgeStack_A.getSize()> 0) 
     { 
      while(tempEdgeStack_A.iterator().hasNext()) 
      { 
       result.push(tempEdgeStack_A.iterator().next()); 
      } 
     } 
     else if(tempEdgeStack_B.getSize()> 0) 
     { 
      while(tempEdgeStack_B.iterator().hasNext()) 
      { 
       result.push(tempEdgeStack_B.iterator().next()); 
      } 
     } 
    } 

    return result; 
} 
} 

這裏的堆棧類(實現鏈表)。爲什麼會出現堆棧溢出錯誤?

import java.util.LinkedList; 
import java.util.ListIterator; 

/** 
* CS 200 Colorado State University, Fall 2011 
*/ 

public class EdgeStack { 


private LinkedList<Edge> llist=new LinkedList<Edge>(); 

public EdgeStack(){ 
    //add your code 
} 

public boolean isEmpty(){ 
    return llist.isEmpty(); 
} 

public void push(Edge e){ 
    llist.add(e); 
} 

public Edge getIndexAt(int n){ 
    return llist.get(n); 
} 

public Edge pop(){ 
    return llist.remove(); 
} 

public Edge peek(){ 

    return llist.getLast(); 
} 

public int getSize(){ 
    return llist.size(); 
} 

// public Edge peek(int n){ 
//  LinkedList<Edge> temp=llist; 
//  return temp.peek(); 
// } 


public LinkedList<Edge> popAll(){ 
    LinkedList<Edge> temp=llist; 
    llist=null; 
    return temp; } 

public ListIterator<Edge> iterator() 
{ 
    return llist.listIterator(); 
} 

    } 
+1

這裏有一些建議的話:如果你發佈這麼多的代碼考慮使用代碼粘貼服務,如https://gist.github.com/。此外,您發佈的代碼無法編譯,因爲Edge類缺失,現在有方法可以對其進行測試,因爲沒有主要的方法可以運行。如果您在Java程序中遇到異常,請確保發佈堆棧跟蹤。人們通常樂於提供幫助,但您也需要表現出一些努力;) – Matt

回答

2

檢查:

else if(tempEdgeStack_A.getSize()> 0) 
    { 
     while(tempEdgeStack_A.iterator().hasNext()) 
     { 
      result.push(tempEdgeStack_A.iterator().next()); 
     } 
    } 
    else if(tempEdgeStack_B.getSize()> 0) 
    { 
     while(tempEdgeStack_B.iterator().hasNext()) 
     { 
      result.push(tempEdgeStack_B.iterator().next()); 
     } 
    } 

你不從堆棧中刪除條目,所以循環不會停止。