2016-11-05 2 views
1

코드에 몇 가지 문제점이 있습니다. 나는 파일에서 코드를 읽고 하나의 스택과 하나의 큐 구조를 만든다. 그러나 코드가 올바르게 실행되지 않았습니다. 자바에서 이중 연결리스트를 사용하는 스택 및 큐

내가 ** 더블 LinkedList의이입니다 스택 클래스를
public class Node 
{ 
String data; 
Node next; 
Node prev; 

public Node(String data,Node next, Node prev){ 

    this.next=next; 
    this.data=data; 
    this.prev=prev; 

} 
public Node(){ 

} 

public String getData(){ 

    return data; 
} 

public void setData(String data){ 

    this.data=data; 
} 

public Node getNext(){ 

    return next; 
} 

public void setNext(Node next){ 
    this.next=next; 
} 

public Node getPrev(){ 

    return prev; 
} 

public void setPrev(Node prev){ 
    this.prev=prev; 
} 
    } 

을 사용 노드 클래스
입니다. 당신은 몇 가지 문제를 가지고 있도록 **

public class Stack { 

Node head = null; 
Node tail = null; 

int size=0; 

     public int getSize() { 
    return size; 
     } 

    public boolean isEmpty() 
     { 
    return head == null; 
    }  
    public void Push(String data) { 

    tail = head; 
    head = new Node(data,null,null); 
    head.data=data; 
    head.next= tail; 
    head.prev = null; 


    if(tail != null) { 
     tail.prev=head; 
    } 

    size++; 

    } 

    public void Pop() { 
    if (!isEmpty()) { 
     head = head.next; // delete first node 
     size--; 
    } else { 
     System.out.println("İs Empty"); 
    } 

} 

    public void Top() { 

    Node tmp = head; 
    while (tmp != null) { 
     System.out.println(tmp.getData()); 
     tmp = tmp.getNext(); 
    } 
} 
    } 

이 큐 클래스

public class Oueues { 

    Node head ; 
    Node tail; 



int size=0; 

public Oueues(){ 
    this.head=null; 
    this.tail=null; 
} 

public boolean isEmpty() 
{ 
    return head == tail; 
}  

    public int getSize() 
    { 
      return size; 
    }  

    public void insert(String data){ 

    Node tmp = new Node(data,null,null); 
    tmp.data=data; 
    tmp.next=null; 

    if(head==null){ 
     head=tail=tmp; 
     head.prev=null; 


    } 
    else{ 
     tail.next=tmp; 
     tmp.prev=tail; 
     tail=tmp; 





    } 
    } 

    public String remove(){ 

    if(head.next==tail) 
     return null;// list empty 
    Node tmp=head.next; 
    head.next=tmp.next; 
    tmp.next.prev=head; 
    list(); 
    return tmp.data; 



    } 

    public void list(){ 
     System.out.println("Queues"); 
     if(size==0){ 
      System.out.println("İs Empty"); 

     } 
    Node tmp=head; 
    while(tmp !=tail.getNext()){ 
     System.out.println(tmp.getVeri()+" "); 
     tmp= tmp.getNext(); 
    } 
     System.out.println(); 
    } 





    } 

않습니다,

import java.io.BufferedReader; 
    import java.io.File; 
    import java.io.FileReader; 
    import java.io.FileWriter; 
    import java.io.IOException; 
    import java.util.Scanner; 

    public class OGrenci { 

    public static void main(String[] args) throws IOException { 

    Scanner s = new Scanner(System.in); 
    Stack y = new Stack(); 
    Oueues k = new Oueues(); 
    FileWriter fwy; 
    FileWriter fwk; 

    File stack = new File("stack.txt"); 

    if (!stack.exists()) { 
     stack.createNewFile(); 
    } else { 
     System.out.println("already exists "); 
    } 

    BufferedReader reader = null; 
    reader = new BufferedReader(new FileReader(stack)); 
    String line = reader.readLine(); 

    while (line != null) { 

     y.Push(line = reader.readLine()); 
     System.out.println(line); 
    } 

    File queue = new File("queue.txt"); 

    if (!queue.exists()) { 
     queue.createNewFile(); 
    } else { 
     System.out.println("already exists "); 
    } 

    BufferedReader read = null; 
    read = new BufferedReader(new FileReader(queue)); 
    String lines = read.readLine(); 

    while (lines != null) { 

     lines = read.readLine(); 
     k.insert(lines); 
     System.out.println(lines); 
    } 

    int choice; 

     System.out.println("1. Stack out- queue add"); 
     System.out.println("2. Stack add- queue out"); 
     System.out.println("3. Stack and queue "); 
     System.out.println("4. File writer"); 
     choice = s.nextInt(); 

    switch (choice) { 
     case 1: 

      k.insert(s.next()); 
      k.list(); 
      y.pop(); 

      break; 
     case 2: 
      y.Push(s.next()); 
      y.Top(); 
      k.remove(); 


      break; 
     case 3: 

      y.Top(); 
      k.list(); 
      break; 
     case 4: 

      fwy = new FileWriter(stack); 
      Node no = y.head; 
      while (no.next != null) { 
       fwy.write("\n" + no.data); 
       no = no.next; 
      } 
      fwy.flush(); 
      fwy.close(); 

      fwk = new FileWriter(queue); 
      Node noo = k.head; 
      while (noo.next != null) { 
       fwk.write("\n" + noo.data); 
       noo = noo.next; 
      } 

      fwk.flush(); 
      fwk.close(); 
      break; 
     } 
     } 
+1

어떤 특정 문제가 있습니까? 오류 메시지 또는 잘못된 출력이 표시됩니까? 코드의 어떤 부분이 예상대로 작동하지 않습니까? – DUman

+1

문제는 스택 클래스와 큐 클래스의 add 메서드 및 완전히 사실이 아닌 메서드 제거입니다. 그 방법은 첫번째 색인을 추가하지 않는다. 또한 모든 파일을 쓰지 않는 파일도 있습니다. – mrsengineer

답변

1

좋아 큐 클래스입니다. 나는 약간을 지적 할 것이고, 이것이 과제와 같이 보이고 당신을 위해 숙제를하고 싶지 않기 때문에 나머지를 고치도록 노력할 것이다. :) 이 파일에서 읽을 때

먼저, 첫 번째 요소를 무시하지 않도록 조심 :

String line = reader.readLine(); 

    while (line != null) 
    { 
     System.out.println("Read from stack: " + line); 

     // we already read one element 
     y.Push(line); 
     line = reader.readLine(); 
    } 

공지 사항 솔루션과는 달리 내가 먼저 우리가 무엇이든 추가하는 것을 잊지 않도록 푸시 y.Push(line)을 수행하는 것이 이미 line으로 읽었습니다. 같은 큐 파일에 간다 : 그것은 null 아니라 다음 다음 줄을 읽으면

String lines = read.readLine(); 

    while (lines != null) 
    { 
     System.out.println("Read from queue: " + lines); 
     // we already read one line 
     k.insert(lines); 
     lines = read.readLine(); 
    } 

그냥 추가합니다. 파일의 첫 번째 요소에서 항상 누락되었습니다.

또 다른 문제는 Queues 클래스입니다 (이 경우 철자가 잘못되어 OQ으로 대체해야합니다). 을 삽입하거나 제거 할 때 크기를 늘리거나 줄이는 것을 잊어 버렸기 때문에이 하나가 올바르게 작동하지 않습니다. 삽입의 끝에서 나는 우리가 그것을 호출하여 list 방법은 NullPointerException를 포기하지 않습니다 size 있도록 모든 시간을 증가하고있어 것을

public void insert(String data){ 

    Node tmp = new Node(data,null,null); 
    tmp.data=data; 
    tmp.next=null; 

    if(head==null){ 
     head=tail=tmp; 
     head.prev=null; 
    } 
    else{ 
     tail.next=tmp; 
     tmp.prev=tail; 
     tail=tmp; 
    } 
    size++; 
} 

알 수 있습니다. 동일은 remove 방법에 간다 :

public String remove(){ 

    if(head == null) 
     return null;// list empty 
    Node tmp=head.next; 
    head.next=tmp.next; 
    tmp.next.prev=head; 
    size--; 
    list(); 
    return tmp.data; 
} 

도 (if(head.next==tail)) 전에 검사도 때문에 head 그래서 당신이 next 멤버에 액세스 할 수 없습니다 항상 null입니다 시작 부분에 NullPointerException을 던지는 것을주의하시기 바랍니다.

public void list(){ 
    System.out.println("Queues"); 
    if(size==0){ 
     System.out.println("İs Empty"); 
     return; 
    } 

    Node tmp=head; 
    while(tmp != tail.getNext()){ 
     System.out.println(tmp.getData() + " "); 
     tmp= tmp.getNext(); 
    } 
    System.out.println(); 
} 

사항은 큐가 비어있는 경우, 그렇지 않으면 우리는 tail.getNext()을 시도합니다 return 항상 NullPointerException을 던질 것이다 : 우리가 이전에 반환하도록 마지막으로 나는뿐만 아니라 list 방법에 작은 개선을했습니다 .

코드에 대한 몇 가지 중요한 생각 이상한 이름을 지정하지 마십시오.왜 대기열인가? 큐 하나 여야합니다. 이상한 변수 이름은 피하십시오. 귀하의 코드는 귀하를위한 것이 아닙니다. 누군가 다른 사람이 읽을 필요가 있으며, 누구인지 알 수 없게됩니다. s, y, k, fwy and fwk.

Scanner scanner = new Scanner(System.in); 
Stack stack = new Stack(); 
Queues queue = new Queues(); 
FileWriter stackFileWriter; 
FileWriter queueFileWriter; 

을 그리고 같은 방법 간다 : 왜이처럼 이름을 지정하지. 왜 Push, PopTop이 대문자 문자 인 으로 시작하는 유일한 방법입니까? 기본 Java 명명 규칙에 동의하지 않으면 적어도 일관성이 있어야합니다.

개선 제안을 시도하고 프로그램 작동 방식을 확인하십시오. 거기에 더 많은 문제가 있다는 것을 거의 확신합니다. 자신을 이해할 수 없다면 의견을 남겨주세요. 나는 당신을 도울 것입니다. 행운을 빕니다!

+1

도와 주셔서 감사합니다. 나는 학생이고 나는 \t 학습 과정이기 때문에 대부분의 시간을 필요로한다. 당신은 매우 친절합니다. 나는 많은 의무가있다. 나는 실수를 바로 잡으며 신중한 구문을 사용할 수있다. – mrsengineer

+1

자, 코드를 단위 테스트하는 법을 배우는 것도 좋은 생각입니다. 테스트하지 않고 많은 코드를 작성하지 않도록하십시오. "코드를 조금만, 조금만 테스트 해"라는 기술을 사용합니다. 예를 들어, 메서드를 추가 한 직후에 단위 테스트를 작성하여 원하는대로 작동하도록 할 수 있습니다. 또한 응답에 만족할 경우 대답을 승인 된 것으로 표시하십시오. – AlinG

관련 문제