資料結構靜態棧的基本功能實現
/* 2018年10月16日10:08:50 棧的基本功能是 出棧 入棧 遵循”先進後出“原則 所以棧的基本函式可以有棧的初始化 出入棧過程中棧的狀態判斷 是否為空或滿 以及銷燬 實現順序棧的基本運算的演算法 (1)初始化棧 (2)判斷棧s是否為空 (3)一次入棧a, b, c, d, e (4)再次判斷棧s是否為空 (5)出棧所有元素 (6)再次判斷是否為空 (7)銷燬棧 */ # include<stdio.h> # include<stdlib.h> # define MAXSIZE 10//注意有一個位置作為棧滿標誌 struct stack* Init_stack(void); bool Gettop(struct stack* s, int* data); bool Pop(struct stack* s, int* data); bool Push(struct stack* s, int data); bool Stack_full(struct stack* s); bool Stack_empty(struct stack* s); void Destroy_stack(struct stack* s); struct stack { int data[MAXSIZE];//棧體 int top;//棧頂 }; int main(void) { struct stack* s = Init_stack(); int data, i; if(Stack_empty(s))//判斷是否為空 printf("stack is not empty!\n"); else printf("stack is empty!\n"); printf("插入:"); for(i = 0; i < 11; i++)//入棧 { if(Push(s, 'a'+i)) putchar('a'+i); else printf("棧滿!\n"); putchar(','); } putchar('\n'); if(Stack_empty(s))//判斷是否為空 printf("stack is not empty!\n"); else printf("stack is empty!\n"); for(i = 0; i < 11; i++)//出棧 { if(Pop(s, &data)) printf("%c ", data); else printf("空棧!\n"); } putchar('\n'); if(Stack_empty(s))//判斷是否為空 printf("stack is not empty!\n"); else printf("stack is empty!\n"); Destroy_stack(s);//銷燬棧 return 0; } /* 初始化棧 呼叫時會返回一個static stack *型別指標 並且這個指標指向一個棧 並且這個棧已經準備好被各種操作*/ struct stack* Init_stack(void) { struct stack* s = (struct stack*)malloc(sizeof(struct stack)); s->top = -1;//初始時設定棧頂為 return s; } void Destroy_stack(struct stack* s) { free(s);//銷燬 } //判斷棧是否為空 true 為非空 false 為空 bool Stack_empty(struct stack* s) { if(s->top == -1)//當兩者相同時為空 return false; else return true; } //判斷棧是否為滿 false 為滿 ture 為非滿 bool Stack_full(struct stack* s) { if(s->top == MAXSIZE - 1) return false;//滿 else return true;//不滿 } //入棧 成功入棧返回true否則返回false bool Push(struct stack* s, int data) {//出棧入棧 時調整棧指標與入棧出棧資料位置不可以調換 if(Stack_full(s))//不滿時入棧 { s->top += 1;//調整棧頂指標 s->data[s->top] = data;//入棧 return true; } return false;//入棧失敗 棧滿 } //出棧 出棧時判斷是否為空 棧為空時出棧失敗返回false 棧不為空返回true bool Pop(struct stack* s, int* data) { if(Stack_empty(s))//是否為空 { *data = s->data[s->top];//調整棧指標 s->top -= 1; return true; } return false; } //取棧頂而不改變棧頂指標 bool Gettop(struct stack* s, int* data) { if(Stack_empty(s))//是否為空 { *data = s->data[s->top];//與出棧基本相同不過 不調整棧指標 return true; } return false; }