<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學習的點點滴滴。

    JAVA Stack(棧)學習代碼

    近日了解一下棧的概念,LIFO,后進先出,順手寫了幾個實現,添加泛型支持,特貼于此:

    /**
    * 定義一個不可變棧
    *
    * @author xiaomin
    *
    * @param <T>
    */
    public class DefaultStack<T extends Serializable> implements Stack<T> {

    private int size;

    private Object[] values;

    private int curr;

    public DefaultStack(int size) {
    this.size = size;

    curr = -1;

    values = new Object[size];
    }

    @Override
    public void push(T t) {
    if ((size - 1) == curr) {
    throw new UnsupportedOperationException("The Stack is full now !");
    }

    curr++;
    values[curr] = t;
    }

    @SuppressWarnings("unchecked")
    @Override
    public T pop() {
    if (curr < 0) {
    throw new UnsupportedOperationException("The Stack is empty now !");
    }

    return (T) values[curr--];
    }

    @Override
    public boolean end() {
    return curr == -1;
    }
    }
    有三個實現:
    /**
    * 定義一個鏈接結構的棧
    *
    * @author xiaomin
    *
    * @param <T>
    */

    public class LinkStack<T extends Serializable> implements Stack<T> {

    /**
    * 定義一個節點
    *
    * @author xiaomin
    *
    */

    private class Node implements Serializable {
    private static final long serialVersionUID = 1L;

    private T value;
    private Node pre;

    // 構造一個空值
    public Node() {
    value = null;
    pre = null;
    }

    public Node(T value, Node pre) {
    this.value = value;
    this.pre = top;
    }
    }

    private Node top = new Node();

    @Override
    public void push(T t) {
    top = new Node(t, top);
    }

    @Override
    public T pop() {
    T value = top.value;

    if (!end())
    top = top.pre;

    return value;
    }

    @Override
    public boolean end() {
    return top.value == null && top.pre == null;
    }
    }

    /**
    * 定義一個不可變棧
    *
    * @author xiaomin
    *
    * @param <T>
    */

    public class DefaultStack<T extends Serializable> implements Stack<T> {

    private int size;

    private Object[] values;

    private int curr;

    public DefaultStack(int size) {
    this.size = size;

    curr = -1;

    values = new Object[size];
    }

    @Override
    public void push(T t) {
    if ((size - 1) == curr) {
    throw new UnsupportedOperationException("The Stack is full now !");
    }

    curr++;
    values[curr] = t;
    }

    @SuppressWarnings("unchecked")
    @Override
    public T pop() {
    if (curr < 0) {
    throw new UnsupportedOperationException("The Stack is empty now !");
    }

    return (T) values[curr--];
    }

    @Override
    public boolean end() {
    return curr == -1;
    }
    }

    /**
    * 定義一個容量可變的棧
    *
    * @author xiaomin
    *
    * @param <T>
    */

    public class ListStack<T extends Serializable> implements Stack<T> {

    private List<T> list = null;

    public ListStack() {
    list = new ArrayList<T>();
    }

    public ListStack(int size) {
    list = new ArrayList<T>(size);
    }

    @Override
    public void push(T t) {
    list.add(t);
    }

    @Override
    public T pop() {
    if (list.isEmpty()) {
    throw new EmptyStackException();
    }

    return list.remove(list.size() - 1);
    }

    @Override
    public boolean end() {
    return list.isEmpty();
    }
    }

    測試代碼如下:
     public static void main(String[] args) {
    System.out.println("link stack ...\n");

    Stack<Integer> linkStack = new LinkStack<Integer>();
    int times = 10;

    testMethod(linkStack, times);

    System.out.println("\ndefault stack ...\n");
    Stack<Integer> defaultStack = new DefaultStack<Integer>(times);

    testMethod(defaultStack, times);

    System.out.println("\nlist stack with enouch space...\n");
    Stack<Integer> listStack = new ListStack<Integer>();

    testMethod(listStack, times*2);
    }

    private static void testMethod(Stack<Integer> linkStack, int times) {
    Random random = new Random(47);

    for (int i = 0; i < times; i++) {
    int value = i * random.nextInt(times);

    System.out.println("節點 " + (i + 1) + " : " + value);

    linkStack.push(value);
    }

    System.out.println("*********************************");

    int nums = times;
    while (!linkStack.end()) {
    System.out.println("節點 " + (nums--) + " : " + linkStack.pop());
    }
    }

    以上代碼簡單易懂,這里不做過多解釋。

    posted on 2010-10-05 11:36 nieyong 閱讀(2250) 評論(0)  編輯  收藏 所屬分類: Java

    公告

    所有文章皆為原創,若轉載請標明出處,謝謝~

    新浪微博,歡迎關注:

    導航

    <2010年10月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 麻豆亚洲AV永久无码精品久久| 免费中文熟妇在线影片| 亚洲国产成人影院播放| 国产亚洲漂亮白嫩美女在线 | 久久国产精品免费专区| 国产亚洲精久久久久久无码AV| 亚洲精品无码你懂的| A在线观看免费网站大全| 亚洲日韩中文字幕| 999在线视频精品免费播放观看 | 国产成人精品免费视频大全| 日本免费A级毛一片| 久久久久亚洲AV成人网人人软件| 一级做a爰性色毛片免费| 伊人久久大香线蕉亚洲| 野花香高清在线观看视频播放免费| 精品亚洲综合在线第一区| 免费在线观看一级片| 亚洲第一区视频在线观看| 色窝窝免费一区二区三区| 激情综合亚洲色婷婷五月APP | 国产在线观看免费不卡| 日韩大片免费观看视频播放| 狠狠综合久久综合88亚洲| 久久狠狠躁免费观看2020| 亚洲AV成人噜噜无码网站| 色www永久免费视频| 亚洲视频网站在线观看| 日本精品人妻无码免费大全 | 久久99亚洲综合精品首页| 国产午夜精品免费一区二区三区 | 精品免费AV一区二区三区| 国产精品亚洲高清一区二区| 亚洲精品无码高潮喷水A片软| 亚洲成人高清在线| 久久aa毛片免费播放嗯啊| 亚洲中文无码永久免费| 亚洲片一区二区三区| 中文字幕免费高清视频| 精品无码专区亚洲| 久久久久亚洲Av无码专|