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

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

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

    聶永的博客

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

    JAVA Stack(棧)學習代碼

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

    /**
    * 定義一個不可變棧
    *
    * @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;
    }
    }
    有三個實現(xiàn):
    /**
    * 定義一個鏈接結(jié)構(gòu)的棧
    *
    * @author xiaomin
    *
    * @param <T>
    */

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

    /**
    * 定義一個節(jié)點
    *
    * @author xiaomin
    *
    */

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

    private T value;
    private Node pre;

    // 構(gòu)造一個空值
    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("節(jié)點 " + (i + 1) + " : " + value);

    linkStack.push(value);
    }

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

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

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

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

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請標明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

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

    統(tǒng)計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产成人亚洲精品| 久久亚洲AV无码精品色午夜| 亚洲色大成网站www永久男同| 成人奭片免费观看| 亚洲日本VA中文字幕久久道具| 性色av免费观看| 日韩亚洲翔田千里在线| 亚洲成a人片在线观看日本麻豆| 免费看又黄又爽又猛的视频软件| 亚洲精品NV久久久久久久久久| 永久免费观看黄网站| 在线观看亚洲成人| 暖暖免费日本在线中文| 亚洲韩国在线一卡二卡| 四虎永久在线精品免费网址| 亚洲a∨无码一区二区| 亚洲一级片免费看| 久久爰www免费人成| 亚洲人成综合在线播放| 四虎永久免费影院| 国产精品极品美女自在线观看免费 | 无码天堂va亚洲va在线va| 亚洲高清成人一区二区三区| 中文在线观看国语高清免费| 久久综合亚洲色一区二区三区 | 日本免费电影一区| 一级免费黄色大片| 久久亚洲精品中文字幕| 最近最新的免费中文字幕 | 暖暖免费日本在线中文| 亚洲一卡2卡4卡5卡6卡在线99| 国产精品成人无码免费| 十八禁视频在线观看免费无码无遮挡骂过 | 亚洲天堂中文字幕| 在线观着免费观看国产黄| 三年片免费高清版| 亚洲精品国产精品国自产网站| 亚洲国产精品不卡毛片a在线| 99爱免费观看视频在线| 亚洲色大成网站www永久男同| 亚洲成a人片在线观看日本|