LList.java
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:3k
源码类别:

编译器/解释器

开发平台:

Others

  1. package antlr.collections.impl;
  2. /* ANTLR Translator Generator
  3.  * Project led by Terence Parr at http://www.jGuru.com
  4.  * Software rights: http://www.antlr.org/RIGHTS.html
  5.  *
  6.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/collections/impl/LList.java#1 $
  7.  */
  8. import antlr.collections.List;
  9. import antlr.collections.Stack;
  10. import java.util.Enumeration;
  11. import java.util.NoSuchElementException;
  12. import antlr.collections.impl.LLCell;
  13. /**A Linked List Implementation (not thread-safe for simplicity)
  14.  * (adds to the tail) (has an enumeration)
  15.  */
  16. public class LList implements List, Stack {
  17. protected LLCell head=null, tail=null;
  18. protected int length=0;
  19. /** Add an object to the end of the list.
  20.  * @param o the object to add
  21.  */
  22. public void add(Object o) { append(o); }
  23. /** Append an object to the end of the list.
  24.  * @param o the object to append
  25.  */
  26. public void append(Object o) {
  27. LLCell n = new LLCell(o);
  28. if ( length==0 ) {
  29. head=tail=n;
  30. length=1;
  31. }
  32. else {
  33. tail.next = n;
  34. tail=n;
  35. length++;
  36. }
  37. }
  38. /**Delete the object at the head of the list.
  39.  * @return the object found at the head of the list.
  40.  * @exception NoSuchElementException if the list is empty.
  41.  */
  42. protected Object deleteHead() throws NoSuchElementException {
  43. if ( head==null ) throw new NoSuchElementException();
  44. Object o = head.data;
  45. head = head.next;
  46. length--;
  47. return o;
  48. }
  49. /**Get the ith element in the list.
  50.  * @param i the index (from 0) of the requested element.
  51.  * @return the object at index i
  52.  * NoSuchElementException is thrown if i out of range
  53.  */
  54. public Object elementAt(int i) throws NoSuchElementException {
  55. int j=0;
  56. for (LLCell p = head; p!=null; p=p.next) {
  57. if ( i==j ) return p.data;
  58. j++;
  59. }
  60. throw new NoSuchElementException();
  61. }
  62. /**Return an enumeration of the list elements */
  63. public Enumeration elements() { return new LLEnumeration(this); }
  64. /** How high is the stack? */
  65. public int height() { return length; }
  66. /** Answers whether or not an object is contained in the list
  67.  * @param o the object to test for inclusion.
  68.  * @return true if object is contained else false.
  69.  */
  70. public boolean includes(Object o) {
  71. for (LLCell p = head; p!=null; p=p.next) {
  72. if ( p.data.equals(o) ) return true;
  73. }
  74. return false;
  75. }
  76. // The next two methods make LLQueues and LLStacks easier.
  77. /** Insert an object at the head of the list.
  78.  * @param o the object to add
  79.  */
  80. protected void insertHead(Object o) {
  81. LLCell c = head;
  82. head = new LLCell(o);
  83. head.next = c;
  84. length++;
  85. if ( tail==null ) tail = head;
  86. }
  87. /**Return the length of the list.*/
  88. public int length() { return length; }
  89. /** Pop the top element of the stack off.
  90.  * @return the top of stack that was popped off.
  91.  * @exception NoSuchElementException if the stack is empty.
  92.  */
  93. public Object pop() throws NoSuchElementException {
  94. Object o = deleteHead();
  95. return o;
  96. }
  97. // Satisfy the Stack interface now.
  98. /** Push an object onto the stack.
  99.  * @param o the object to push
  100.  */
  101. public void push(Object o) { insertHead(o); }
  102. public Object top() throws NoSuchElementException {
  103. if ( head==null ) throw new NoSuchElementException();
  104. return head.data;
  105. }
  106. }