将标记插入双链表

时间:2014-02-20 23:47:06

标签: java stringtokenizer doubly-linked-list

我试图通过对数字表达式进行标记并将其放入我在实验室作业中创建的双向链表来存储数学表达式。我在交付实验室之前测试时在列表中实现的插入方法完全正常,但是当我在插入表达式的标记后打印列表的内容时,一些标记丢失了。我知道字符串标记符正在工作,因为我打印了所有标记,它们都显示正常。

是否有关于String Tokenizer如何标记字符串的内容,这些字符串阻止我将它们作为通用对象插入到我的链接列表中?我觉得这里有一些我不知道的行为。

供参考,该类包含标记字符串并将其插入列表的方法:

import java.io.File;
import java.io.FileNotFoundException;
import java.lang.*;
import java.util.*;

public class Calculator {
DoubleLinkedListTest infixstorage;

public Calculator(){
    infixstorage = new DoubleLinkedListTest();
}

public static DoubleLinkedListTest ReadInFile(String path){
    File file = new File(path);
    DoubleLinkedListTest list = new DoubleLinkedListTest();

    try {
        Scanner scanner = new Scanner(file);

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            StringTokenizer st = new StringTokenizer(line);
            while (st.hasMoreTokens()){
                list.insert(st.nextToken());
            }
        }
        scanner.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return list;
}

}

以下是DoubleLinkedList的代码:

public class DoubleLinkedListTest implements DoubleLinkedList {
private DoubleNode head;
private DoubleNode tail;

public DoubleLinkedListTest(){
    head = new DoubleNode();
    tail = new DoubleNode();
    head.next = tail;
    tail.prev = head;
}

public void insert(Object x){
    if (lookup(x) == false){
        if (head.data == null){
            head.data = x;
        }
        else if (head.data != null && tail.data == null){
            tail.data = x;
        }
        else{
            DoubleNode NewNode = new DoubleNode();
            NewNode.data = x;
            NewNode.next = null;
            NewNode.prev = tail;
            tail.next = NewNode;
            tail = NewNode;
        }
    }
}
    //Runtime of insert method will be n, where n is the number of nodes

public void delete(Object x){
    if (this.lookup(x).equals(true)){
        if(x.equals(head.data)){
            head.next.prev = null;
            head = head.next;
        }

        else{
            DoubleNode temp = head;
            while(temp.next != null){
                if (temp.next.next == null && (temp.next).data.equals(x)){
                    temp.next.prev = null;
                    temp.next = null;
                    break;
                }
                if ((temp.next).data.equals(x)){
                    temp.next.next.prev = temp;
                    temp.next = (temp.next).next;
                    break;
                }
                else{
                    temp = temp.next;
                }
            }
        }
    }


}

public Object lookup(Object x){
    Boolean search = false;

    if (x.equals(head.data)){
        search = true;
    }

    else{
        DoubleNode temp = head;
        while (temp.next != null){
            if (x.equals(temp.data)){
                search = true;
                break;
            }
            if (temp.next.next == null && x.equals(temp.next.data)){
                search = true;
                break;
            }

            else{
                temp = temp.next;
            }
        }
    }
    return search;  
}

public boolean isEmpty(){
    if(head.next == tail && tail.prev == head)
        return true;
    else
        return false;

}

public void printList(){
    DoubleNode temp = head;
    System.out.println(temp.data + " ");

    while (temp.next != null){
        temp = temp.next;
        System.out.println(temp.data + " ");
    }

}

public void printListRev(){
    System.out.print(tail.data + " ");

    while (tail.prev != head){
        tail = tail.prev;
        printList();
    }


}
}

1 个答案:

答案 0 :(得分:0)

我明白了。扫描仪一次读取文件的多行。我认为有一行,但它只是在txt文件中出现。它实际上是三条线彼此相邻。

编辑:错误警报,删除其他行后,仍然错误地读取剩余的行

编辑2:或者至少列表的打印不正确