更新時(shí)間:2020-07-20 16:24:10 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2747次
棧:一種僅允許在一端進(jìn)行插入和刪除操作的線性表。它按照后進(jìn)先出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時(shí)候從棧頂開(kāi)始彈出數(shù)據(jù)(最后一個(gè)數(shù)據(jù)被第一個(gè)讀出來(lái)),允許進(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)勢(shì)。

以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java編程基礎(chǔ)之?dāng)?shù)據(jù)結(jié)構(gòu)棧”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)