zoukankan      html  css  js  c++  java
  • 使用链表实现栈

    使用链表实现栈


    1 public interface Stack<E> {
    2 
    3     int getSize();
    4     boolean isEmpty();
    5     void push(E e);
    6     E pop();
    7     E peek();
    8 }
     1 public class LinkedListStack<E> implements Stack<E> {
     2 
     3     private LinkedList<E> list;
     4 
     5     public LinkedListStack(){
     6         list = new LinkedList<>();
     7     }
     8 
     9     @Override
    10     public int getSize(){
    11         return list.getSize();
    12     }
    13 
    14     @Override
    15     public boolean isEmpty(){
    16         return list.isEmpty();
    17     }
    18 
    19     @Override
    20     public void push(E e){
    21         list.addFirst(e);
    22     }
    23 
    24     @Override
    25     public E pop(){
    26         return list.removeFirst();
    27     }
    28 
    29     @Override
    30     public E peek(){
    31         return list.getFirst();
    32     }
    33 
    34     @Override
    35     public String toString(){
    36         StringBuilder res = new StringBuilder();
    37         res.append("Stack: top ");
    38         res.append(list);
    39         return res.toString();
    40     }
    41 
    42     public static void main(String[] args) {
    43 
    44         LinkedListStack<Integer> stack = new LinkedListStack<>();
    45 
    46         for(int i = 0 ; i < 5 ; i ++){
    47             stack.push(i);
    48             System.out.println(stack);
    49         }
    50 
    51         stack.pop();
    52         System.out.println(stack);
    53     }
    54 }
      1 public class LinkedList<E> {
      2 
      3     private class Node{
      4         public E e;
      5         public Node next;
      6 
      7         public Node(E e, Node next){
      8             this.e = e;
      9             this.next = next;
     10         }
     11 
     12         public Node(E e){
     13             this(e, null);
     14         }
     15 
     16         public Node(){
     17             this(null, null);
     18         }
     19 
     20         @Override
     21         public String toString(){
     22             return e.toString();
     23         }
     24     }
     25 
     26     private Node dummyHead;
     27     private int size;
     28 
     29     public LinkedList(){
     30         dummyHead = new Node();
     31         size = 0;
     32     }
     33 
     34     // 获取链表中的元素个数
     35     public int getSize(){
     36         return size;
     37     }
     38 
     39     // 返回链表是否为空
     40     public boolean isEmpty(){
     41         return size == 0;
     42     }
     43 
     44     // 在链表的index(0-based)位置添加新的元素e
     45     // 在链表中不是一个常用的操作,练习用:)
     46     public void add(int index, E e){
     47 
     48         if(index < 0 || index > size)
     49             throw new IllegalArgumentException("Add failed. Illegal index.");
     50 
     51         Node prev = dummyHead;
     52         for(int i = 0 ; i < index ; i ++)
     53             prev = prev.next;
     54 
     55         prev.next = new Node(e, prev.next);
     56         size ++;
     57     }
     58 
     59     // 在链表头添加新的元素e
     60     public void addFirst(E e){
     61         add(0, e);
     62     }
     63 
     64     // 在链表末尾添加新的元素e
     65     public void addLast(E e){
     66         add(size, e);
     67     }
     68 
     69     // 获得链表的第index(0-based)个位置的元素
     70     // 在链表中不是一个常用的操作,练习用:)
     71     public E get(int index){
     72 
     73         if(index < 0 || index >= size)
     74             throw new IllegalArgumentException("Get failed. Illegal index.");
     75 
     76         Node cur = dummyHead.next;
     77         for(int i = 0 ; i < index ; i ++)
     78             cur = cur.next;
     79         return cur.e;
     80     }
     81 
     82     // 获得链表的第一个元素
     83     public E getFirst(){
     84         return get(0);
     85     }
     86 
     87     // 获得链表的最后一个元素
     88     public E getLast(){
     89         return get(size - 1);
     90     }
     91 
     92     // 修改链表的第index(0-based)个位置的元素为e
     93     // 在链表中不是一个常用的操作,练习用:)
     94     public void set(int index, E e){
     95         if(index < 0 || index >= size)
     96             throw new IllegalArgumentException("Update failed. Illegal index.");
     97 
     98         Node cur = dummyHead.next;
     99         for(int i = 0 ; i < index ; i ++)
    100             cur = cur.next;
    101         cur.e = e;
    102     }
    103 
    104     // 查找链表中是否有元素e
    105     public boolean contains(E e){
    106         Node cur = dummyHead.next;
    107         while(cur != null){
    108             if(cur.e.equals(e))
    109                 return true;
    110             cur = cur.next;
    111         }
    112         return false;
    113     }
    114 
    115     // 从链表中删除index(0-based)位置的元素, 返回删除的元素
    116     // 在链表中不是一个常用的操作,练习用:)
    117     public E remove(int index){
    118         if(index < 0 || index >= size)
    119             throw new IllegalArgumentException("Remove failed. Index is illegal.");
    120 
    121         // E ret = findNode(index).e; // 两次遍历
    122 
    123         Node prev = dummyHead;
    124         for(int i = 0 ; i < index ; i ++)
    125             prev = prev.next;
    126 
    127         Node retNode = prev.next;
    128         prev.next = retNode.next;
    129         retNode.next = null;
    130         size --;
    131 
    132         return retNode.e;
    133     }
    134 
    135     // 从链表中删除第一个元素, 返回删除的元素
    136     public E removeFirst(){
    137         return remove(0);
    138     }
    139 
    140     // 从链表中删除最后一个元素, 返回删除的元素
    141     public E removeLast(){
    142         return remove(size - 1);
    143     }
    144 
    145     // 从链表中删除元素e
    146     public void removeElement(E e){
    147 
    148         Node prev = dummyHead;
    149         while(prev.next != null){
    150             if(prev.next.e.equals(e))
    151                 break;
    152             prev = prev.next;
    153         }
    154 
    155         if(prev.next != null){
    156             Node delNode = prev.next;
    157             prev.next = delNode.next;
    158             delNode.next = null;
    159             size --;
    160         }
    161     }
    162 
    163     @Override
    164     public String toString(){
    165         StringBuilder res = new StringBuilder();
    166 
    167         Node cur = dummyHead.next;
    168         while(cur != null){
    169             res.append(cur + "->");
    170             cur = cur.next;
    171         }
    172         res.append("NULL");
    173 
    174         return res.toString();
    175     }
    176 }
  • 相关阅读:
    POJ 1082 博弈推规律
    博弈论总结
    POJ 2502 Subway 关键在建图
    【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?
    一位ACMer过来人的心得
    POJ1724 Dij队列优化邻接表
    Dijkstra队列优化矩阵版
    Uva247 Floyd传递闭包+map处理
    简爬新浪新闻网
    爬href链接
  • 原文地址:https://www.cnblogs.com/mingmingmomo/p/9288932.html
Copyright © 2011-2022 走看看