用順序表表示的棧的基本操作代碼:
#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;
}