[데이터 구조] c 언어 는 체인 스 택 의 입 스 택, 출 스 택, 비우 기, 소각 등 작업 을 실현 합 니 다.

6579 단어 데이터 구조
최근 에 데이터 구조 에 있 는 스 택 을 배우 고 있 습 니 다. 그래서 스 택 체인 구조의 추상 적 인 데이터 형식 을 기록 합 니 다.
/*
        
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 
#include 

#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("
"
); return OK; } /* */ Status visit(SElemType e) { printf("%d ",e); return OK; } int main() { SElemType e,i; PLinkStack s; printf("InitStack 1--12
"
); if(InitStack(&s)) for(e = 1; e <= 12; e++) { Push(s,&e); } printf("StackTraverse :
"
); StackTraverse(s,visit); Pop(s,&e); printf("Pop :%d
"
,e); Pop(s,&e); printf("Pop :%d
"
,e); printf("Push %d
"
,e); Push(s,&e); printf("StackEmpty :%d(1: 0: )
"
,StackEmpty(s)); GetTop(s,&e); printf("GetTop :%d
"
,e); printf("StackLength: %d
"
,StackLength(s)); ClearStack(s); printf("ClearStack ,StackEmpty %d(1: 0: )
"
,StackEmpty(s)); DestroyStack(&s); printf("DestroyStack "); return 0; }

좋은 웹페이지 즐겨찾기