鏈式棧的基本操作——LinkStack(C語言版)

#include "stdafx.h"
#include <malloc.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存儲空間初始分配量 */

typedef int Status; 
typedef int SElemType; /* SElemType類型根據實際情況而定,這裏假設爲int */

/* 鏈棧結構 */
typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;

Status visit(SElemType c)
{
    printf("%d ",c);
    return OK;
}

/*  構造一個空棧S */
Status InitStack(LinkStack *S)
{ 
    S->top = (LinkStackPtr)malloc(sizeof(StackNode));
    if(!S->top)
    {
        return ERROR;
    }

    S->top = NULL;
    S->count = 0;
    return OK;
}

/* 把S置爲空棧 */
Status ClearStack(LinkStack *S)
{ 
    LinkStackPtr p,q;
    p = S->top;
    while(p)
    {  
        q = p; /* "q" is the prev node of node "p"*/
        p = p->next;
        free(q);
    } 
    S->count=0;

    return OK;
}

/* 若棧S爲空棧,則返回TRUE,否則返回FALSE */
Status IsEmptyStack(LinkStack S)
{ 
    if (S.count == 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/* 返回S的元素個數,即棧的長度 */
int GetStackLength(LinkStack S)
{ 
    return S.count;
}

/* 若棧不空,則用e返回S的棧頂元素,並返回OK;否則返回ERROR */
Status GetTopElem(LinkStack S,SElemType *e)
{
    if (S.top == NULL)
    {
        return ERROR;
    }
    else
    {
        *e = S.top->data;
    }
    return OK;
}

/* 插入元素e爲新的棧頂元素 */
Status Push(LinkStack *S,SElemType e)
{
    LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
    if (!s)
    {
        return ERROR;
    }
    s->data = e;
    s->next = S->top;/* 把當前的棧頂元素賦值給新結點的直接後繼,見圖中① */
    S->top = s;      /* 將新的結點s賦值給棧頂指針,見圖中② */
    S->count++;

    return OK;
}

/* 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR */
Status Pop(LinkStack *S,SElemType *e)
{ 
    LinkStackPtr p;
    if(IsEmptyStack(*S))
    {
        return ERROR;
    }

    *e = S->top->data;
    p = S->top; /* 將棧頂結點賦值給p,見圖中③ */
    S->top = S->top->next;/* 使得棧頂指針下移一位,指向後一結點,見圖中④ */
    free(p);              /* 釋放結點p */        
    S->count--;

    return OK;
}

Status StackTraverse(LinkStack S)
{
    LinkStackPtr p;
    p=S.top;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int j;
    LinkStack s;
    int e;
    if(InitStack(&s)==OK)
        for(j=1;j<=10;j++)
            Push(&s,j);
    printf("棧中元素依次爲:");
    StackTraverse(s);
    Pop(&s,&e);
    printf("彈出的棧頂元素 e=%d\n",e);
    printf("棧空否:%d(1:空 0:否)\n",IsEmptyStack(s));
    GetTopElem(s,&e);
    printf("棧頂元素 e=%d 棧的長度爲%d\n",e,GetStackLength(s));
    ClearStack(&s);
    printf("清空棧後,棧空否:%d(1:空 0:否)\n",IsEmptyStack(s));

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章