一、基本概念
棧是一種數(shù)據(jù)結(jié)構(gòu),是只能在某一端插入和刪除的特殊線性表。它按照后進先出的原則存儲數(shù)據(jù),先進入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時候從棧頂開始彈出數(shù)據(jù)(最后一個數(shù)據(jù)被第一個讀出來)。
棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數(shù)為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。 棧也稱為先進后出表。
??梢杂脕碓诤瘮?shù)調(diào)用的時候存儲斷點,做遞歸時要用到棧!
棧的模型
二、基本算法
1、進棧(PUSH)算法
①若TOP≥n時,則給出溢出信息,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢出;不滿則作②);
?、谥肨OP=TOP+1(棧指針加1,指向進棧地址);
?、跾(TOP)=X,結(jié)束(X為新進棧的元素);
2、退棧(POP)算法
?、偃鬞OP≤0,則給出下溢信息,作出錯處理(退棧前先檢查是否已為空棧, 空則下溢;不空則作②);
?、赬=S(TOP),(退棧后的元素賦給X):
?、跿OP=TOP-1,結(jié)束(棧指針減1,指向棧頂)。
三、棧的實現(xiàn)
棧分順序棧和鏈?zhǔn)綏?,下面程序介紹了順序棧的實現(xiàn)。
java棧的實現(xiàn)
public class MyStack { //定義一個堆棧類
int[] array; //用int數(shù)組來保存數(shù)據(jù),根據(jù)需要可以換類型
int s_size; //定義堆棧的寬度
public MyStack(int i){ //定義一個帶參數(shù)構(gòu)造器
array=new int[i]; //動態(tài)定義數(shù)組的長度
s_size=0; //堆棧的默認(rèn)寬度為0
}
public MyStack(){ //默認(rèn)構(gòu)造器
this(50); //默認(rèn)構(gòu)造器可容納50個元素
}
public void push(int i){ //壓棧
array[this.s_size]=i;
this.s_size++;
}
public int pop(){ //從堆棧中取元素,從棧頂開始取
if(this.s_size!=0){
int t=array[s_size-1]; //用中間變量保存棧頂?shù)脑?br> array[s_size-1]=0; //取完元素該位置設(shè)為0
s_size--; //棧的大小減1
return t; //返回棧頂元素
}else{
System.out.println("This stack is empty"); //當(dāng)棧為空時顯示提示信息,返回0
return 0;
}
}
public boolean isEmpty(){ //判斷棧是否為空
return this.s_size==0;
}
public int top(){