順序棧——棧的順序表示和實現

用順序表表示的棧的基本操作代碼:

#include<cstdio>
#include<cstdlib> 
#define SElemType int 
#define Status int 
#define STACK_INIT_SIZE 100	//初始空間分配量
#define STACKINCREMENT	10		//存儲空間分配增量 

using namespace std;
//棧的結構
typedef struct {
	SElemType *base;	//棧底指針,在棧結構不存在(構造之前和銷燬之後),base的值爲NULL
	SElemType *top;		//棧頂指針,非空棧的棧頂指針始終在棧頂元素的的下一個位置上 
	int stacksize;		//可存儲的最大容量,即最多存儲的元素個數 
}SqStack; 
 
//初始化棧
/**
說明,這裏使用C語言的malloc和realloc
除此之外,還可以使用c++的new運算符(	S.base = new SElemType[MAXSIZE];)
但是,new運算符在給定一個定長數組初始化後,長度變不能改變(c++沒有realloc函數) 
改進有兩個方法,
(1)、在初始化時,使用vector變長數組代替數組
(2)、新建一個更大的數組,將原有的元素複製過去(realloc就是這個原理) 
*/ 
Status InitStack(SqStack &S){
	S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base){	//動態空間分配失敗
		printf("動態空間分配失敗\n");
		return 0; 
	} 
	S.top = S.base;	//棧頂指針初值指向棧底,即top=base表示空棧
	S.stacksize = STACK_INIT_SIZE;		//標記空間大小
	printf("初始化成功\n");
	return 0; 
} 

//入棧
Status Push(SqStack &S, SElemType e){
	//判斷棧是否滿;
	if(S.top-S.base >= S.stacksize){	//棧滿,追加 
		S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); 
		if(!S.base){
			printf("動態空間分配失敗\n");
			return 0;
		} 
	S.top = S.base+S.stacksize;		//更新棧頂元素指針
	S.stacksize += STACKINCREMENT;	//更新最大容量 
	}
	*S.top++ = e;	//插入到棧頂並將棧頂指針加一
	printf("插入成功\n");
	return 0; 
} 

//創建棧,就是重複的將元素入棧(當然也可以單獨寫一個創建的函數)
void Creat(SqStack &S,int n){
	InitStack(S);
	for(int i=0;i<n;i++){
		int e;
		scanf("%d",&e); 
		Push(S,e);
	}
	printf("創建成功\n");
}  

//獲取元素個數
Status StackLength(SqStack S){
	int count = S.top-S.base;
	return count;
} 
//判斷棧空
bool StackEmpty(SqStack S){
	if(S.base == S.top){
		printf("棧爲空\n");
		return true;
	}else{
		printf("棧不爲空\n");
		return false;
	} 
} 

//獲取棧頂元素
Status GetTop(SqStack S,SElemType e){
	//若棧不爲空
	if(!StackEmpty(S)){
		e = *(S.top-1);
		printf("棧頂元素值爲:%d\n",e);
	}
	return 0;
} 

//出棧
Status Pop(SqStack &S,SElemType e){
	//判斷棧空 
	if(!StackEmpty(S)){
		e = *--S.top;
		printf("棧頂元素%d出棧成功\n",e);
	}
	return 0;
} 

//遍歷--從棧底到棧頂的元素輸出
Status StackTraverse(SqStack S){
	printf("遍歷開始:\n");
	for(SElemType *i=S.base;i<S.top;i++){	//從底部開始,到棧頂的前一個停止 
		printf("%d ",*i);
	}
	printf("\n");
} 

//置空
Status ClearStack(SqStack &S){
	S.top = S.base;		//不能寫成S.base = S.top;    位置不能反了 
	printf("置空成功\n"); 
	return 0;
} 

//銷燬
Status DestoryStack(SqStack &S){
	free(S.base);	//銷燬連續空間 
	S.base = NULL;	//底指針指針賦空
	S.top = NULL;	//棧棧頂指針賦空 
	S.stacksize = 0;	//棧最大容量置爲0 
	printf("銷燬成功");
	return 0; 
} 
 
int main(){
	int n,value1,value2;
	SqStack S;
	printf("請輸入元素個數");                        
	scanf("%d",&n);
	Creat(S,n);
	printf("棧中元素的個數爲%d\n",StackLength(S));
	Pop(S,value2); 
	GetTop(S,value1);
	StackTraverse(S);
	ClearStack(S); 
	StackEmpty(S);
	DestoryStack(S);
	return 0;
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章