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

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 女人体1963午夜免费视频| 亚洲精品视频免费在线观看| 久久永久免费人妻精品下载| 亚洲精品视频免费观看| 视频一区在线免费观看| 国产大片线上免费看| 亚洲精品无码av片| 免费爱爱的视频太爽了| 国产AV无码专区亚洲AV蜜芽| 国产在线19禁免费观看国产| 国产成人亚洲午夜电影| 亚洲精品无码日韩国产不卡?V| 一本久久A久久免费精品不卡| 免费国产成人高清视频网站| 久久久无码精品亚洲日韩按摩| 亚洲乱码在线观看| 可以免费看黄视频的网站| 亚洲色精品88色婷婷七月丁香| 亚洲a∨无码男人的天堂| 欧美三级在线电影免费| 亚洲AV无码成人专区片在线观看| 国产成人精品日本亚洲专区6| 国产精品视频全国免费观看| 国产精品无码免费播放| 亚洲成在人线在线播放无码| 亚洲国产综合精品中文字幕| 免费视频精品一区二区三区 | 亚洲精品网站在线观看你懂的| 波多野结衣免费在线| 亚洲av无码日韩av无码网站冲| 亚洲国产精品人人做人人爱| 亚洲fuli在线观看| 国产成人免费片在线视频观看| 国产免费人成视频尤勿视频| 免费永久在线观看黄网站| 亚洲最大福利视频| 又黄又大又爽免费视频| 日本亚洲欧洲免费天堂午夜看片女人员 | 久久久久久成人毛片免费看| 亚洲已满18点击进入在线观看| 免费v片视频在线观看视频|