• 栈是一种基于后进先出的数据集合。用链表实现比数组实现更加高效。

    使用链表以及泛型机制来实现可以达到最优设计目标:

      (1)可以处理任意类型的数据;

      (2)所需的空间总是和集合的大小成正比;

      (3)操作所需的时间总是和集合的大小无关。

    ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

    数组实现代码:

     1 import java.util.Iterator;
     2 import java.util.Scanner;
     3 
     4 public class ResizingArrayStack<Item> implements Iterable<Item> {
     5     
     6     private Item[] a = (Item[]) new Object[1];        //item
     7     private int n = 0;                                //size
     8 
     9     public boolean isEmpty(){
    10         return n == 0;
    11     }
    12 
    13     public int size(){
    14         return n;
    15     }
    16 
    17     private void resize(int max){
    18         //new Item[max]
    19         Item[] tmp = (Item[]) new Object[max];
    20         for(int i = 0; i < n; i ++){
    21             tmp[i] = a[i];
    22         }
    23         a = tmp;
    24     }
    25 
    26     public void push(Item item){
    27         if(n == a.length){
    28             //full
    29             resize(n * 2);
    30         }
    31         a[n ++] = item;
    32     }
    33 
    34     public Item pop(){
    35         Item item = a[-- n];
    36         a[n] = null;            //avoid loitering
    37 
    38         if(n > 0 && n == a.length / 4){
    39             //too large
    40             resize(a.length / 2);
    41         }
    42 
    43         return item;
    44     }
    45 
    46     public Iterator<Item> iterator(){
    47         return new ReverseArrayIterator();
    48     }
    49 
    50     private class ReverseArrayIterator implements Iterator<Item> {
    51 
    52         private int i = n;
    53         
    54         public boolean hasNext(){
    55             return i > 0;
    56         }
    57 
    58         public Item next(){
    59             return a[-- i];
    60         }
    61 
    62         public void remove(){}
    63         
    64     }
    65 
    66     public static void main(String[] args) {
    67         Scanner in = new Scanner(System.in);
    68 
    69         ResizingArrayStack<String> s = new ResizingArrayStack<>();
    70         while(in.hasNext()){
    71             String item = in.next();
    72             if(!item.equals("-")){
    73                 s.push(item);
    74             }
    75             else if(!s.isEmpty()){
    76                 System.out.print(s.pop() + " ");
    77             }
    78         }
    79 
    80         System.out.println("(" + s.size() + " left on stack)");
    81     }
    82 }

    链表实现代码:

     1 import java.util.Scanner;
     2 import java.util.Iterator;
     3 
     4 public class Stack<Item> implements Iterable<Item>{
     5 
     6     private class Node{
     7         //LinkedList Node
     8         Item item = null;
     9         Node next = null;
    10     }
    11 
    12     private Node first = null;        //top
    13     private int n = 0;                //size
    14 
    15     public boolean isEmpty(){
    16         return first == null;
    17     }
    18 
    19     public int size(){
    20         return n;
    21     }
    22 
    23     public void push(Item item){
    24         Node oldFirst = first;
    25         first = new Node();
    26         first.item = item;
    27         first.next = oldFirst;
    28         n ++;
    29     }
    30 
    31     public Item pop(){
    32         Item item = first.item;
    33         first = first.next;
    34         n --;
    35         return item;
    36     }
    37 
    38     public Iterator<Item> iterator(){
    39         return new ListIterator();
    40     }
    41 
    42     private class ListIterator implements Iterator<Item>{
    43         private Node current = first;
    44 
    45         public boolean hasNext(){
    46             return current != null;
    47         }
    48 
    49         public Item next(){
    50             Item item = current.item;
    51             current = current.next;
    52             return item;
    53         }
    54 
    55         public void remove(){}
    56     }
    57     
    58     public static void main(String[] args) {
    59         Scanner in = new Scanner(System.in);
    60 
    61         Stack<String> s = new Stack<>();
    62         while(in.hasNext()){
    63             String item = in.next();
    64             if(!item.equals("-")){
    65                 s.push(item);
    66             }
    67             else if(!s.isEmpty()){
    68                 System.out.print(s.pop() + " ");
    69             }
    70         }
    71 
    72         System.out.println("(" + s.size() + " left on stack)");
    73     }
    74 }

     (参考自《Algorithm 4th》)

  • 相关阅读:
    面试题_回溯法
    面试题专题_目录
    面试题_有序数组的二分法解法
    Linux 信号捕获堆栈信息
    Git 简单基础命令的应用
    【转】【C#】常用ToString()方法总结
    【转】【Revit】Revit 二次开发 特殊族实例参照获取
    使用移除图片背景(提取人像)的开源项目rembg
    X64Dbg 介绍>表达式
    0314遗忘的角落,一文说清什么是测试策略
  • 原文地址:https://www.cnblogs.com/7hat/p/3718131.html
Copyright © 2020-2023  润新知