一、概念
棧和隊列,也是基于順序表和鏈表實現的
棧是一種特殊的線性表,其只允許在固定的一段進行插入和刪除元素操作。
遵循后進先出的原則
此處所見到的棧,本質上就是一個順序表/鏈表,但是,實在順序表/鏈表的基礎上做出了限制
對棧來說禁止了順序表/鏈表的各種增刪改查,只支持三個操作:入棧、出棧、取棧頂元素
因此我們可以認為,棧就是只支持尾插、尾刪、獲取尾部元素的順序表/鏈表
棧雖然在功能上做出了限制,但是他卻是能在特定場景下,解決特定問題的特定手段
*順序表鏈表這樣的結構,功能太豐富了,容易出錯;棧/隊列針對特定的場景,對順序表鏈表做出了限制,從而大大降低了出錯的概率
二、棧的一些操作
package stack;import java.util.Stack;public class test1 {public static void main(String[] args) {//使用 標準庫的棧Stack<String> stack = new Stack<>();//入棧操作stack.push("aaa");stack.push("bbb");stack.push("ccc");//取棧頂元素,知識查看一下棧頂的元素內容,不會把整個元素出棧String top = stack.peek();System.out.println(top);//出棧,返回當前出棧的元素的內容String str = stack.pop();System.out.println(str);}}
三、Stack基本功能的實現
package stack;//模擬實現一個棧
//可以基于順序表(數組)實現,也可以基于鏈表來實現
//基于數組更加簡單public class MyStack {private String[] arr;private int size =0;public MyStack(){arr = new String[1000];size =0;}public MyStack(int capacity){arr = new String[capacity];size = 0;}public void resize(){//1.創建一個更長的數組String[] newArr = new String[arr.length*2];//2.把原來數組的元素復制到新數組for (int i =0;i<arr.length;i++){newArr[i] = arr[i];}//3.把新數組賦值給原數組arr = newArr;}//入棧public void push(String elem){//如果空間不夠了我們要實現擴容操作if(size == arr.length){resize();}//實現一個尾插操作arr[size]= elem;size++;}//出棧public String pop(){//考慮特殊情況if(size ==0){throw new RuntimeException("Stack is empty!");}String str = arr[size-1];//不要忘了把元素個數減去一個size--;return str;}//獲取棧頂元素public String peek(){if(size == 0 ){throw new RuntimeException("Stack is empty!");}String elem = arr[size-1];return elem;//這里跟上面出棧的不同就是這里的元素個數不要--}}