棧以及JAVA實現


后進先出

棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

API

public class StackOfString//儲存字符串的棧

	StackOfString()//創建對象
void push(String item)//入棧
String pop()//出棧
boolean isEmpty()//判斷棧是否為空
int size()//棧中對象數目

示例

  • 空棧什么也沒有
  • push('a')
graph BT 1(a,棧底,棧頂)
  • push('b')
graph TD 2(b,棧頂)==>1(a,棧底)
  • push('c')
graph TD 2(b)==>1(a,棧底) 3(c,棧頂)==>2
  • pop()
graph TD 2(b,棧頂)==>1(a,棧底)

鏈表棧

令棧頂指向棧底方向,保存指向棧頂元素的引用,可以提高入棧出棧的效率

Code by java

public class StackOfString {
    private class Node{//內部類
        String item;//存儲的String對象
        Node next;//指向下一個Node的引用
    }
    private Node first=null;//初始棧頂對象為空
    public boolean isEmpty(){//判斷棧是否為空,只要看first是否等於null
        return first==null;
    }
    public void push(String item){//添加元素
        Node oldfist=first;//拷貝first
        first=new Node();//令first指向新的Node
        first.item=item;//新Node存儲的字符串為傳入的參數
        first.next=oldfist;//令新的Node的next等於舊的first,也就是說令新的棧頂元素指向舊的棧頂元素
    }
    public String pop(){//刪除元素
        String item=first.item;//拷貝棧頂元素存儲的字符串
        first=first.next;//令棧頂元素指向它的下一個元素
        return item;
    }
}

數組棧

數組棧使用一個數組當作棧,好處是節省了空間,缺點是長度固定,有多余空間,而且有下標越界的風險,

public class FixedCapacityStackOfString {
    private String[] s;
    private int N=0;//N表示棧頂元素的下一個元素的下標
    public FixedCapacityStackOfString(int capacity){//根據傳入的capacity確定字符串數組的長度
        s=new String[capacity];
    }
    public boolean isEmpty(){
        return N==0;//如果N等於0,即棧頂元素的下一個元素為0,則棧為空
    }
    public void push(String item){//入棧
        s[N++]=item;//注意!!這里的意思是,先給數組s的N下標位置賦值,然后N=N+1
    }
    public String pop(){
        String item=s[--N];//注意!!這里的意思是,先N=N-1,然后給數組s的N下標位置的字符串拷貝下來
        s[N]=null;//令棧頂元素的下一個元素為null,即使得垃圾回收器可以回收這部分空間
        return item;//返回拷貝的字符串
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM