Java實(shí)現(xiàn)棧的順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)

棧(Stack)

? 棧是具有一定操作約束的線性表,它只在一端(棧頂)做插入和刪除操作,它是典型的后進(jìn)先出的一種數(shù)據(jù)結(jié)構(gòu),特別的,插入數(shù)據(jù)稱為入棧(Push),刪除數(shù)據(jù)稱為出棧(Pop)。

抽象數(shù)據(jù)類型描述

? 數(shù)據(jù)對(duì)象集:一個(gè)有0個(gè)或多個(gè)元素的線性表。

? 操作集:Item 代表數(shù)據(jù)元素類型

  • int length() 返回棧的長(zhǎng)度(所包含的元素的個(gè)數(shù))。
  • boolean isEmpty() 棧是否為空。
  • void push(Item item) 入棧。
  • Item pop() 出棧

棧的順序存儲(chǔ)

? 在類的內(nèi)部使用數(shù)組來存儲(chǔ)元素,數(shù)組的大小會(huì)根據(jù)需要?jiǎng)討B(tài)的變化,因?yàn)橛幸粋€(gè)resize()方法,使用N來表示棧頂?shù)纳厦嬉粋€(gè)位置,入棧時(shí),先將元素放入data[N],N再進(jìn)行加一的操作;反之,出棧時(shí),先將N減一,取出元素,再置此時(shí)data[N]的值為null,避免對(duì)象游離。為了能夠使??梢员闅v,實(shí)現(xiàn)了Iterable接口,完整代碼如下:

public class ArrayStack<Item> implements Iterable<Item> {

    private Item[] data = (Item[]) new Object[1]; // 棧里的數(shù)據(jù)
    private int N = 0; // 棧的元素個(gè)數(shù)

    public boolean isEmpty(){
        return N==0;
    }

    public int length(){
        return N;
    }

    public void resize(int len){
        Item[] temp = (Item[]) new Object[len];
        for (int i=0; i<N; i++){
            temp[i] = data[i];
        }
        data = temp;
    }

    public void push(Item item){
        if (N == data.length){
            this.resize(2* data.length);
        }
        data[N++] = item;
    }

    public Item pop(){
        Item item = data[--N];
        data[N] = null; // 避免對(duì)象游離
        if (N>0 && N==data.length/4){
            this.resize(data.length/2);
        }
        return item;
    }

    @Override
    public Iterator<Item> iterator() {
        return new ReverseArrayIterator();
    }

    // 內(nèi)部類
    public class ReverseArrayIterator implements Iterator<Item>{
        private int i = N;

        public boolean hasNext(){
            return i>0;
        }

        public Item next(){
            return data[--i];
        }

        public void remove(){

        }
    }

    public static void main(String[] args) {
        ArrayStack<Integer> testStack = new ArrayStack<>();
        testStack.push(1);
        testStack.push(2);
        testStack.push(3);
        testStack.push(4);
        for (Integer i:testStack){
            System.out.println(i);
        }
        testStack.pop();
        for (Integer i:testStack){
            System.out.println(i);
        }
    }
}

棧的鏈?zhǔn)酱鎯?chǔ)

? 設(shè)定一個(gè)top指針表示棧頂,所以顯然當(dāng)topnull時(shí),表示???。入棧:新建一個(gè)oldTop變量指向此時(shí)的top指向,再讓top指向新插入的元素結(jié)點(diǎn),再設(shè)其next指針指向oldTop;出棧:只需在取出元素之后讓棧頂指針指向下一個(gè)元素即可,完整代碼如下:

public class Stack<Item> implements Iterable<Item> {
    private Node top;
    private int N;

    private class Node{
        Item item;
        Node next;

        public Node(Item item, Node next) {
            this.item = item;
            this.next = next;
        }
    }

    public boolean isEmpty(){
        return top==null;
    }

    public int length(){
        return N;
    }

    public void push(Item item){
        Node oldTop = top;
        top = new Node(item,oldTop);
        N = N + 1;
    }

    public Item pop(){
        Item item = top.item;
        top = top.next;
        return item;
    }

    @Override
    public Iterator<Item> iterator() {
        return new StackIterator();
    }

    private class StackIterator implements Iterator<Item>{

        private Node current = top;

        @Override
        public boolean hasNext() {
            return current != null;
        }

        @Override
        public Item next() {
            Item item = current.item;
            current = current.next;
            return item;
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容