1. 程式人生 > >資料結構靜態棧的基本功能實現

資料結構靜態棧的基本功能實現

/*     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;      }