在java中使用双向链表的堆栈和队列

时间:2016-11-05 18:11:37

标签: java data-structures

我有一些代码问题。我在代码中读取文件并构建一个堆栈和一个队列结构。但代码没有正确运行。

这是Node类 我使用Double 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 个答案:

答案 0 :(得分: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中。队列文件也是如此:

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,请添加它,然后阅读下一行。你总是错过文件中的第一个元素。

另一个问题是Queues类(顺便说一下,拼写错误,你应该用O替换Q)。这个不能正常工作,因为当您插入或删除时,您忘记增加和减小尺寸

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

请注意,在插入的最后我增加了size,以便list方法在每次调用时都不会抛出NullPointerExceptionremove方法也是如此:

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))也在抛出NullPointerException,因为在head开始时null总是next,因此您无法访问{{1}成员。 最后,我对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,否则我们将尝试执行tail.getNext(),这将始终抛出NullPointerException

关于代码的一些重要想法 请避免奇怪的命名。为什么队列?只有一个所以它应该是队列。 请避免使用奇怪的变量名称。您的代码不仅适合您,其他人可能需要阅读,而且很难知道它是谁s, y, k, fwy and fwk。为什么不这样命名:

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

方法也是如此。为什么PushPopTop是唯一以大写字母开头的方法?如果你不同意标准的Java命名约定,那就好但至少要保持一致:)。

尝试建议的改进,看看你的程序是如何运作的。 我几乎可以肯定还有更多问题。如果您无法自己解决问题,请发表评论,我会帮助您。祝你好运!