棧:一種僅允許在一端進(jìn)行插入和刪除操作的線性表。它按照后進(jìn)先出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時(shí)候從棧頂開始彈出數(shù)據(jù)(最后一個(gè)數(shù)據(jù)被第一個(gè)讀出來),允許進(jìn)行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動(dòng);棧中元素個(gè)數(shù)為零時(shí)稱為空棧。插入一般稱為進(jìn)棧(PUSH),刪除則稱為退棧(POP)。棧也稱為后進(jìn)先出表(LIFO,Last In First Out)。
棧一次只允許操作一個(gè)數(shù)據(jù)項(xiàng),即最后插入的數(shù)據(jù)項(xiàng)。
下面是用Java數(shù)組實(shí)現(xiàn)的順序存儲(chǔ)結(jié)構(gòu)的棧。
package?cn.zhf.list;?class?MyStack?{????private?int?maxSize;//定義棧的最大容量????private?int[]?stackArray;//以數(shù)組方式存儲(chǔ)元素????private?int?top;//棧頂?????//構(gòu)造器,初始化????public?MyStack(int?x){????????maxSize?=?x;????????stackArray?=?new?int[x];????????top?=?-1;????}????//插入元素????public?void?push(int?x){????????stackArray[++top]?=?x;????}????//刪除頂部元素????public?int?pop(){????????return?stackArray[top--];????}????//查看棧頂部元素????public?int?peek(){????????return?stackArray[top];????}????//判斷棧是否為空????public?boolean?isEmpty(){????????return?(top?==?-1);????}????//判斷棧是否已滿????public?boolean?isFull(){????????return?(top?==?maxSize-1);????}}
下面是使用鏈表實(shí)現(xiàn)的棧。
package?cn.zhf.list;//鏈表內(nèi)存放的數(shù)據(jù)對(duì)象包裝public?class?link?{????public?int?idata;//存放int?類型的數(shù)據(jù)????public?double?ddata;//double類型的數(shù)據(jù)????public?link?next;//對(duì)下一個(gè)link對(duì)象的引用????public?link(int?id,?double?dd)?{????????idata?=?id;????????ddata?=?dd;????}????public?void?diaplay()?{????????System.out.println(idata?+?","?+?ddata);????}}//鏈表public?class?linkList?{????private?link?first;//鏈表中保存的數(shù)據(jù)????public?linkList()?{????????first?=?null;????}????public?boolean?isEmpty()?{????????return?(first?==?null);????}????//插入一個(gè)元素????public?void?insertFirst(int?id,?double?dd)?{????????link?link?=?new?link(id,?dd);????????link.next?=?first;//next元素鏈接first????????first?=?link;//first元素鏈接link????}????//刪除一個(gè)元素????public?link?deleteFirst()?{????????link?temp?=?first;????????first?=?first.next;????????return?temp;????}????//顯示鏈表的元素????public?void?displaylink()?{????????link?current?=?first;????????while?(current?!=?null)?{????????????current.diaplay();????????????current?=?current.next;????????}????}}//用鏈表實(shí)現(xiàn)的棧public?class?linkStack?{????????private?linkList?list;????????public?linkStack(){????????????list?=?new?linkList();????????}????????public?void?push(int?id,double?dd){????????????list.insertFirst(id,?dd);????????}????????public?link?pop(){????????????return?list.deleteFirst();????????}????????public?boolean?isEmpty(){????????????return?list.isEmpty();????????}????????public?void?display(){????????????list.displaylink();????????}????public?static?void?main(String[]?args)?{????????linkStack?ls?=?new?linkStack();????????ls.push(1,?2.1);????????ls.push(2,?2.2);????????ls.push(3,?2.3);????????ls.display();????????????????ls.pop();????????????????ls.display();????}?}
棧中的基本操作是:入棧、出棧和查看棧頂元素,以上兩種實(shí)現(xiàn)方式不一樣,但是方法名一樣,實(shí)現(xiàn)的功能也相同,因此可以將Stack定義為一個(gè)接口,兩個(gè)類分別實(shí)現(xiàn)這個(gè)接口,這樣,對(duì)于調(diào)用者完全隱藏了實(shí)現(xiàn)的細(xì)節(jié),但不影響使用,這大概就是接口的抽象優(yōu)勢。
以上就是北大青鳥長沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java編程基礎(chǔ)之?dāng)?shù)據(jù)結(jié)構(gòu)棧”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。