1. 程式人生 > >[資料結構]c語言實現鏈棧的入棧,出棧,清空,銷燬等操作

[資料結構]c語言實現鏈棧的入棧,出棧,清空,銷燬等操作

最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別

/*
棧的抽象資料型別
ADT 棧(stack)
Data
    同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係
Operation
    InitStack(*S):初始化操作,建立一個空棧S
    DestroyStack(*S):若棧存在,則銷燬它
    ClearStack(S):將棧清空
    StackEmpty(S):若棧為空,返回true,否則返回false
    GetTop(S,*e):若棧存在且非空,用e返回S的棧頂元素
    Push(S,e):若棧存在,插入新元素e到棧S中併成為棧頂元素
    Pop(S,*e):刪除棧S中棧頂元素,並用e返回其值
    StackTraverse(S):遍歷棧中所有元素
    StackLength(S):從棧頂遍歷所有元素
endADT

 */
#include <stdio.h> #include <stdlib.h> #define OVERFLOW -1 #define STACK_INIT_SIZE 10 #define STACKINCREMENT 2 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int SElemType; typedef int Status; typedef struct
StackNode { SElemType data; struct StackNode *next; }StackNode, *LinkStackPtr; typedef struct LinkStack { LinkStackPtr top; int count; }*PLinkStack; /*初始化棧*/ Status InitStack(PLinkStack *S) { *S = (PLinkStack)malloc(sizeof(struct LinkStack)); (*S)->top = NULL; (*S)->count = 0
; return OK; } /*清空棧*/ Status ClearStack(PLinkStack S) { LinkStackPtr p; while(S->top){ p = S->top; S->top = S->top->next; S->count--; free(p); } return OK; } /*銷燬棧*/ Status DestroyStack(PLinkStack *S) { ClearStack(*S); free(*S); return OK; } /*判斷棧是否為空*/ Status StackEmpty(PLinkStack S) { if(S->top)/*棧存在且非空*/ return FALSE; else return TRUE; } /* 若棧存在且非空,用e返回S的棧頂元素 */ Status GetTop(PLinkStack S,SElemType *e) { if(!S->top)return ERROR; *e = S->top->data; return OK; } /*入棧*/ Status Push(PLinkStack S,SElemType *e) { LinkStackPtr p = (LinkStackPtr)malloc(sizeof(struct StackNode)); p->data = *e; p->next = S->top; S->top = p; S->count++; return OK; } /*出棧*/ Status Pop(PLinkStack S,SElemType *e) { LinkStackPtr p; if(!GetTop(S,e))return ERROR; p = S->top; S->top = S->top->next; S->count--; free(p); return OK; } /*檢視棧元素個數*/ int StackLength(PLinkStack S) { return S->count; } /*遍歷棧中所有元素*/ Status StackTraverse(PLinkStack S,Status (* visit)(SElemType)) { LinkStackPtr p; p = S->top; while(p){ visit(p->data); p = p->next; } printf("\n"); return OK; } /*顯示元素格式*/ Status visit(SElemType e) { printf("%d ",e); return OK; } int main() { SElemType e,i; PLinkStack s; printf("InitStack初始化棧並將1--12壓入棧\n"); if(InitStack(&s)) for(e = 1; e <= 12; e++) { Push(s,&e); } printf("StackTraverse棧中元素從棧頂依次為:\n"); StackTraverse(s,visit); Pop(s,&e); printf("Pop彈出的元素為:%d\n",e); Pop(s,&e); printf("Pop又彈出的元素為:%d\n",e); printf("Push將剛剛彈出的元素%d再次壓入\n",e); Push(s,&e); printf("StackEmpty判斷棧是否為空:%d(1:是 0:不是)\n",StackEmpty(s)); GetTop(s,&e); printf("GetTop當前棧頂元素為:%d\n",e); printf("StackLength:當前棧長度為%d \n",StackLength(s)); ClearStack(s); printf("ClearStack棧清空後,StackEmpty棧是否為空%d(1:是 0:不是)\n",StackEmpty(s)); DestroyStack(&s); printf("DestroyStack棧銷燬"); return 0; }