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

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

  (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》)

posted @ 2014-05-09 08:47  7hat  阅读(176)  评论(0编辑  收藏  举报