日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.1_栈_顺序存储结构(数组形式)

發布時間:2025/4/14 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_栈_顺序存储结构(数组形式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。