当前位置:   article > 正文

java 链表实现栈_java 链表栈

java 链表栈

由于栈是先入后出的,使用链表的方式实现栈,时间复杂度都是O(1),以下是一个链表实现栈的例子:

LinkedListStack.java

  1. public class LinkedListStack<E> implements Stack<E> {
  2.     private LinkedList<E> list;
  3.     public LinkedListStack(){
  4.         list = new LinkedList<>();
  5.     }
  6.     @Override
  7.     public int getSize(){
  8.         return list.getSize();
  9.     }
  10.     @Override
  11.     public boolean isEmpty(){
  12.         return list.isEmpty();
  13.     }
  14.     @Override
  15.     public void push(E e){
  16.         list.addFirst(e);
  17.     }
  18.     @Override
  19.     public E pop(){
  20.         return list.removeFirst();
  21.     }
  22.     @Override
  23.     public E peek(){
  24.         return list.getFirst();
  25.     }
  26.     @Override
  27.     public String toString(){
  28.         StringBuilder res = new StringBuilder();
  29.         res.append("Stack: top ");
  30.         res.append(list);
  31.         return res.toString();
  32.     }
  33.     public static void main(String[] args) {
  34.         LinkedListStack<Integer> stack = new LinkedListStack<>();
  35.         for(int i = 0 ; i < 5 ; i ++){
  36.             stack.push(i);
  37.             System.out.println(stack);
  38.         }
  39.         stack.pop();
  40.         System.out.println(stack);
  41.     }
  42. }


Stack.java:

  1. public interface Stack<E> {
  2.     int getSize();
  3.     boolean isEmpty();
  4.     void push(E e);
  5.     E pop();
  6.     E peek();
  7. }

LinkedList.java

  1. public class LinkedList<E> {
  2.     private class Node{
  3.         public E e;
  4.         public Node next;
  5.         public Node(E e, Node next){
  6.             this.e = e;
  7.             this.next = next;
  8.         }
  9.         public Node(E e){
  10.             this(e, null);
  11.         }
  12.         public Node(){
  13.             this(null, null);
  14.         }
  15.         @Override
  16.         public String toString(){
  17.             return e.toString();
  18.         }
  19.     }
  20.     private Node dummyHead;
  21.     private int size;
  22.     public LinkedList(){
  23.         dummyHead = new Node();
  24.         size = 0;
  25.     }
  26.     // 获取链表中的元素个数
  27.     public int getSize(){
  28.         return size;
  29.     }
  30.     // 返回链表是否为空
  31.     public boolean isEmpty(){
  32.         return size == 0;
  33.     }
  34.     // 在链表的index(0-based)位置添加新的元素e
  35.     // 在链表中不是一个常用的操作,练习用:)
  36.     public void add(int index, E e){
  37.         if(index < 0 || index > size)
  38.             throw new IllegalArgumentException("Add failed. Illegal index.");
  39.         Node prev = dummyHead;
  40.         for(int i = 0 ; i < index ; i ++)
  41.             prev = prev.next;
  42.         prev.next = new Node(e, prev.next);
  43.         size ++;
  44.     }
  45.     // 在链表头添加新的元素e
  46.     public void addFirst(E e){
  47.         add(0, e);
  48.     }
  49.     // 在链表末尾添加新的元素e
  50.     public void addLast(E e){
  51.         add(size, e);
  52.     }
  53.     // 获得链表的第index(0-based)个位置的元素
  54.     // 在链表中不是一个常用的操作,练习用:)
  55.     public E get(int index){
  56.         if(index < 0 || index >= size)
  57.             throw new IllegalArgumentException("Get failed. Illegal index.");
  58.         Node cur = dummyHead.next;
  59.         for(int i = 0 ; i < index ; i ++)
  60.             cur = cur.next;
  61.         return cur.e;
  62.     }
  63.     // 获得链表的第一个元素
  64.     public E getFirst(){
  65.         return get(0);
  66.     }
  67.     // 获得链表的最后一个元素
  68.     public E getLast(){
  69.         return get(size - 1);
  70.     }
  71.     // 修改链表的第index(0-based)个位置的元素为e
  72.     // 在链表中不是一个常用的操作,练习用:)
  73.     public void set(int index, E e){
  74.         if(index < 0 || index >= size)
  75.             throw new IllegalArgumentException("Set failed. Illegal index.");
  76.         Node cur = dummyHead.next;
  77.         for(int i = 0 ; i < index ; i ++)
  78.             cur = cur.next;
  79.         cur.e = e;
  80.     }
  81.     // 查找链表中是否有元素e
  82.     public boolean contains(E e){
  83.         Node cur = dummyHead.next;
  84.         while(cur != null){
  85.             if(cur.e.equals(e))
  86.                 return true;
  87.             cur = cur.next;
  88.         }
  89.         return false;
  90.     }
  91.     // 从链表中删除index(0-based)位置的元素, 返回删除的元素
  92.     // 在链表中不是一个常用的操作,练习用:)
  93.     public E remove(int index){
  94.         if(index < 0 || index >= size)
  95.             throw new IllegalArgumentException("Remove failed. Index is illegal.");
  96.         Node prev = dummyHead;
  97.         for(int i = 0 ; i < index ; i ++)
  98.             prev = prev.next;
  99.         Node retNode = prev.next;
  100.         prev.next = retNode.next;
  101.         retNode.next = null;
  102.         size --;
  103.         return retNode.e;
  104.     }
  105.     // 从链表中删除第一个元素, 返回删除的元素
  106.     public E removeFirst(){
  107.         return remove(0);
  108.     }
  109.     // 从链表中删除最后一个元素, 返回删除的元素
  110.     public E removeLast(){
  111.         return remove(size - 1);
  112.     }
  113.     // 从链表中删除元素e
  114.     public void removeElement(E e){
  115.         Node prev = dummyHead;
  116.         while(prev.next != null){
  117.             if(prev.next.e.equals(e))
  118.                 break;
  119.             prev = prev.next;
  120.         }
  121.         if(prev.next != null){
  122.             Node delNode = prev.next;
  123.             prev.next = delNode.next;
  124.             delNode.next = null;
  125.             size --;
  126.         }
  127.     }
  128.     @Override
  129.     public String toString(){
  130.         StringBuilder res = new StringBuilder();
  131.         Node cur = dummyHead.next;
  132.         while(cur != null){
  133.             res.append(cur + "->");
  134.             cur = cur.next;
  135.         }
  136.         res.append("NULL");
  137.         return res.toString();
  138.     }
  139. }

使用链表实现栈和使用数组实现栈的比较:
1.    使用链表和使用数组实现栈的方式在时间复杂度上都是O(1)级别的
2.    经过测试,使用链表和使用数据实现栈的方式操作耗时是不相伯仲的。
3.    使用数组实现,需要在一定操作之后进行数组空间的重新开辟,使用链表更多体现在new链表节点的实例化上。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/611848
推荐阅读
相关标签
  

闽ICP备14008679号