棧: 順序儲存
棧是一種先進後出(First In Last Out,FILO)的資料結構
如果你將兩個元素壓入棧,先加入的元素將在後加入的元素之後出棧
棧頂元素值為null(未滿時)
定義棧的資料結構
#define MAX_SIZE 1024
//利用陣列模擬棧的順序儲存
typedef struct sqStack{
void *data[MAX_SIZE];
int size; //棧的元素數量
} sqStack;
初始化
sqStack* initStack(){
sqStack *s = (sqStack*)malloc(sizeof(sqStack));
for (int i = 0; i < MAX_SIZE; i++){
s->data[i] = NULL;
}
s->size = 0;
return s;
};
入棧
void PushStack(sqStack *s, void* data){
if(s==NULL) return; //如果棧為空
if(s->size==MAX_SIZE) return; //如果棧已滿
if(data==NULL) return; //如果插入資料為null
s->data[s->size] = data;
s->size++;
};
返回棧頂元素
void* topSqStack(sqStack *s){
if(s==NULL) return NULL;
if(s->size==0) return NULL;
return s->data[(s->size-1)]; //第一個元素在棧頂之下
};
彈出棧頂元素
void* PopStack(sqStack *s){
if(s==NULL) return NULL;
if(s->size==0) return NULL;
s->data[s->size-1] = NULL; //將元素彈出
s->size--; //棧頂下移
};
判斷棧是否為空
int ifEmpty_Stack(sqStack *s){
if(s==NULL) return -1; //SQstack_ERROR
if(s->size==0) return 1; //SQStack_TRUE
return 2; //SQStack_FALSE
};
返回棧中的元素個數
int Size_Stack(sqStack *s){
if(s==NULL) return -1;
return s->size;
};
清空棧
void clear_Stack(sqStack *s){
if(s==NULL) return;
if(s->size==0) return;
for (int i = 0; i < s->size; i++){
s->data[i] = NULL; //清空所有資料
}
s->size=0;
};
銷燬棧
void destroy_Stack(sqStack *s){
if(s==NULL) return;
free(s);
};
棧順序儲存的測試
定義棧中元素的資料結構
typedef struct PERSON{
char name[64];
int age;
} Person;
測試
int main(){
//建立棧
sqStack* stack = initStack();
//建立資料
Person p1 = {"aaa",10};
Person p2 = {"bbb",20};
Person p3 = {"ccc",30};
Person p4 = {"ddd",40};
//進棧
PushStack(stack, &p1);
PushStack(stack, &p2);
PushStack(stack, &p3);
PushStack(stack, &p4);
//輸出
while(Size_Stack(stack)>0){
//訪問棧頂元素
Person* person = (Person*)topSqStack(stack);
cout << person->name << " " << person->age << endl;
//彈出棧頂元素
PopStack(stack);
}
//釋放記憶體
destroy_Stack(stack);
system("pause");
return 0;
}
返回元素的順序與壓入的順序相反(先進後出)