資料結構03-棧

阿海是個呆瓜發表於2022-05-02

順序棧

1、基本概念

棧是限定僅在表尾進行插入或刪除操作的線性表,表末端為棧頂(Top),表頭稱為棧頂(Bottom),不含元 素稱為空戰 (用順序表儲存的棧更常見) 因此棧又稱為後進先出(Last in First out, LIFO)的線性表。

2、資料型別定義

//順序棧ADT
typedef struct SequenceStack
{
    // 棧底
    int *base;
    // 棧頂
    int *top;
}SequenceStack;

3、功能實現

bool InitStack(SequenceStack &S){
    S.base=new int[Maxsize];       //為順序棧分配一個最大容量為Maxsize的空間
	if(!S.base)                    //空間分配失敗
		return false;
	S.top=S.base;                 //top初始為base,空棧
	return true;
}

bool Push(SequenceStack &S,int e){
    if(S.top-S.base==Maxsize)      //棧滿
		return false;
	*(S.top++)=e;                 //元素e壓入棧頂,然後棧頂指標加1,等價於*S.top=e; S.top++;
	return true;
}

bool Pop(SequenceStack &S,int e){
    if(S.top == S.base)      //棧空
		return false;
	e = *(--S.top);                 //元素e壓入棧頂,然後棧頂指標加1,等價於*S.top=e; S.top++;
	return true;
}

int GetTop(SequenceStack S){          //取棧頂 
	if(S.top!=S.base)          //棧非空
		return *(S.top-1);     //返回棧頂元素的值,棧頂指標不變
    else
        return -1;
}

3、測試程式碼

int main(){
   int n,x;
	SequenceStack S;
	InitStack(S);//初始化一個順序棧S
	cout<<"請輸入元素個數n:"<<endl;
	cin>>n;
	cout<<"請依次輸入n個元素,依次入棧:"<<endl;
	while(n--){
		cin>>x; //輸入元素
		Push(S,x);
	}
	cout<<"元素依次出棧:"<<endl;
	while(S.top!=S.base){//如果棧不空,則依次出棧
        cout<<GetTop(S)<<"\t";//輸出棧頂元素
        Pop(S,x);   //棧頂元素出棧
    }
	return 0;
}

相關文章