2016-11-05 6 views
1

私はコードにいくつか問題があります。私はコードでファイルを読み取り、1つのスタックと1つのキュー構造を構築します。しかし、コードは正しく実行されませんでした。二重リンクリストを使用したスタックとキュー

は、これは私が

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; } } 

ダブルのLinkedListを使用Nodeクラス
です**これは、スタッククラスです。 **

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(); 
    } 





    } 

は、これは[OK]を

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メソッドとremoveメソッドが完全に真ではないことです。そのメソッドは最初のインデックスを追加しません。また、すべてのデータは書かれていません。 – mrsengineer

答えて

1

キュークラスですので、あなたは、問題のカップルを持っています。私はいくつかを指摘し、残りの部分を修正するために働くことができます。これは割り当てのように見えるので、私はあなたの宿題をしたくありません:)。

ファイルから読み込んまず、最初の要素を無視しないように注意してください:私たちは何でも追加することを忘れないように、あなたのソリューションとは異なり、私が最初にプッシュy.Push(line)を行うこと

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(); 
    } 

をお知らせすでにlineに読み込まれています。同じことは、キューファイルのために行く:

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(); 
    } 

それはnullない場合はちょうどそれを追加し、次の行を読み取ります。あなたはファイルの最初の要素に常に欠けていました。

もう1つの問題は、Queuesクラスです(途中で間違っていると、OQに置き換える必要があります)。 を挿入または削除すると、サイズが増減するのを忘れてしまっているため、これは正しく動作していません。

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++; 
} 

list方法は、我々はそれを呼び出すNullPointerExceptionたびに投げないように、インサートの終わりに、私は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を投げていたことに注意してください。 我々は以前に返すように最後に私もlist方法に小さな改良を加えました:

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(); 
} 

お知らせreturnキューが空の場合はそうでない場合は、我々は常にNullPointerExceptionがスローされますどのtail.getNext()を行うにしようと、 。

一般的なコードに関する重要な考え方 奇妙な名前は避けてください。なぜキュー?ただ1つでキューにする必要があります。 奇妙な変数名は避けてください。あなたのコードはあなたのためだけではなく、他の誰かが読む必要があるかもしれないし、それが誰であるかを知ることは難しいです。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,PopおよびTopが、の大文字ので始まる唯一の方法ですか?あなたが標準的なJavaの命名規則に同意しない場合は、少なくとも一貫性があります。

提案されている改善を試して、プログラムがどのように機能しているかを確認してください。 私はほとんど確信していますそれにはより多くの問題があります。あなたがそれらを理解することができない場合は、コメントを残して、私はあなたを助けます。がんばろう!

+1

ありがとうございます。私は学生であり、私は\t学習プロセスであるため、ほとんどの時間を助けてください。ご親切に。私はずっと義務づけられている。私は間違いを訂正し、私は構文を慎重にすることができます。 – mrsengineer

+1

また、コードの単体テスト方法を学ぶこともお勧めします。それが動作するかどうかをテストせずにたくさんのコードを書くことは避けてください。メソッドを追加した直後に、例えば単体テストを書いて、必要に応じて動作するかどうかを確認するために、「コードを少し、少しテストする」テクニックを使用します。また、回答に満足している場合は、回答にマークを付けてください。 – AlinG

関連する問題