3.1_栈_顺序存储结构(数组形式)
生活随笔
收集整理的這篇文章主要介紹了
3.1_栈_顺序存储结构(数组形式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【棧的定義】
棧(stack)是限定僅在表尾進行插入和刪除操作的線性表。
棧又稱為后進先出(Last In First Out)線性表,簡稱LIFO結構。
(PS:定義中的表尾是指 棧頂!)
?
【幾個關鍵詞 】
[ 棧頂(top) ]
允許插入和刪除的一端稱為 棧頂。
[ 棧底(bottom) ]
棧頂的另一端稱為 棧底。
[ 空棧 ]
不含任何數據元素的棧。
?
【棧的插入操作——進棧(push)】
棧的插入操作,叫做進棧,也稱為壓棧、入棧。
?
【棧的刪除操作——出棧(pop)】
棧的刪除操作,叫做出棧,也稱為彈棧。
? ? ? ?
?
【進棧出棧的變化形式】
如果3個整數1,2,3依次入棧,會有哪些出棧次序?
第一種:1-2-3進棧,即3-2-1出棧。
第二種:1進,1出,2斤,2出,3進,3出,進一個出一個,即1-2-3出棧。
第三種:1進,2進,2出,1出,3進,3出,即2-1-3出棧。
第四種:1進,1出,2進,3進,3出,2出,即1-3-2出棧。
第四種:1進,2進,2出,3進,3出,2出,即2-3-1出棧
?
【棧的抽象數據類型】
ADT 棧(stack) Data同線性表。元素具有相同的類型,相鄰元素具有前驅和后繼關系。 OperationInitStack(*S) 初始化操作,建立一個空棧SDestoryStack(*S) 若棧存在,則銷毀它ClearStack(*S) 將棧清空StackEmpty(S) 若棧為空,返回true,否則返回false。GetTop(S,*e) 若棧S存在且非空,用e返回S的棧頂元素。Push(*S,e) 若棧S存在,插入新元素e到棧S中并成為棧頂元素。 Pop(*S,*e) 刪除棧S中棧頂元素,并用e返回其值。 StackLength(S) 返回棧S的元素個數。 endADT?
【自定義的棧MyStack.java】
package com.Higgin.Stack;import java.util.ArrayList; import java.util.Arrays; import java.util.EmptyStackException;public class MyStack {protected Object[] elementData; //棧中具體的對象數組protected int elementCount; //棧頂指針protected int capacityIncrement;//當棧滿了,每次增長棧的容量 public MyStack(int initialCapacity,int capacityIncrement){if(initialCapacity<0){ //如果初始化棧的容量小于0,拋出異常throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}this.elementData=new Object[initialCapacity];this.capacityIncrement=capacityIncrement;}public MyStack(int initialCapacity){this(initialCapacity,0); //默認增長的容量為0 }public MyStack(){this(10); //默認初始棧的容量為10 }/*** 返回棧中的已存的元素個數*/public int size(){return elementCount;}/*** 判斷是否為空棧*/public boolean empty(){return size()==0;}/*** 進棧*/public Object push(Object obj){if((elementCount+1)>elementData.length){ //如果再添加一個對象,導致溢出,則擴容(若不想擴容直接拋出異常即可)grow(elementCount+1); //擴容 }elementData[elementCount++]=obj;return obj;}/*** 查看棧頂部的元素,但不從棧中移除它*/public Object peek(){int len=size();if(len==0){throw new EmptyStackException();}return elementData[len-1];}/*** 出棧*/public Object pop(){Object obj=peek(); //獲取棧頂的對象,里面包含了判斷棧是否為空的判斷elementCount--;elementData[elementCount]=null;return obj;}/*** 查找對象的位置*/public int search(Object obj){if(size()==0){ //如果是空棧,直接不找throw new EmptyStackException();}int i=lastIndexOf(obj);if(i>=0){return size()-i;}return -1;}/*** 擴容* (如果再存入數據時,容量不夠,就進行擴容)*/public void grow(int minCapacity){ //擴容方法int oldCapacity=elementData.length; //原來的容量int newCapacity=oldCapacity+((capacityIncrement>0)?capacityIncrement:oldCapacity); //增長后的新容量:設置過就為 老容量+設置值 ,否則就直接翻倍 if(newCapacity<minCapacity){ //如果新增后的容量依然過小,直接把當前值指針的值傳過來(這個應該是容量過大的時候)newCapacity=minCapacity;}if(newCapacity-Integer.MAX_VALUE>8){ if(minCapacity<0){ //說明都溢出了throw new OutOfMemoryError(); //直接拋出錯誤 }newCapacity=(minCapacity>(Integer.MAX_VALUE-8)?Integer.MAX_VALUE:(Integer.MAX_VALUE-8));}elementData=Arrays.copyOf(elementData, newCapacity); //擴容后的elementData }/*** 找出obj對象在 elementData[i]中最后的位置,對于棧而言,其實是離棧頂最近的位置*/public int lastIndexOf(Object obj){if(obj==null){for(int i=elementCount-1;i>=0;i--){if(elementData[i]==null){return i;}}}else{for(int i=elementCount-1;i>=0;i--){if(obj.equals(elementData[i])){return i;}}}return -1;} }?
【測試】
package com.Higgin.Stack;import org.junit.Test;public class TestMyStack {@Testpublic void test1(){MyStack ms=new MyStack();System.out.println("是否為空==="+ms.empty()); //truems.push(11);ms.push(22);ms.push(33);System.out.println("最近一次添加的是33==="+ms.peek()); //33ms.push(44); ms.push(55);System.out.println("最近一次添加的是55==="+ms.peek()); //55System.out.println("尋找22的位置==="+ms.search(22)); //4System.out.println("尋找55的位置==="+ms.search(55)); //1System.out.println("尋找99的位置(不存在)==="+ms.search(99)); //-1 ms.pop(); System.out.println("執行了一次pop,棧頂的元素==="+ms.peek()); //44System.out.println("棧移除了之后的長度為===="+ms.size()); //4 } }【運行結果】
?
轉載于:https://www.cnblogs.com/HigginCui/p/6095247.html
總結
以上是生活随笔為你收集整理的3.1_栈_顺序存储结构(数组形式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第九课课堂总结
- 下一篇: Android 自动生成表格