壓棧出棧遍歷棧實例代碼

n42g 9年前發布 | 2K 次閱讀 C/C++

    #include<stdio.h>

#include<stdlib.h>  
#include<malloc.h>  

typedef struct Node//定義一個鏈表結構體  
{  
    int data;  
    struct Node* pNext;  
}NODE,*PNODE;  

typedef struct Stack//定義一個棧結構體  
{  
    PNODE pTop;  
    PNODE pBottom;  
}STACK,*PSTACK;  

void initStack(PSTACK);  
void pushStack(PSTACK,int);  
void travelStack(PSTACK);  
bool popStack(PSTACK,int*);  
void clear(PSTACK ps);  
int main()  
{  
    int val;  
    STACK S;//定義一個S變量,該變量有兩個參數。一個pTop,一個pBotton   
    initStack(&S);//初始化棧  
    pushStack(&S,1);//壓棧  
    pushStack(&S,2);  
    pushStack(&S,3);  
    pushStack(&S,4);  
    pushStack(&S,5);  

    travelStack(&S);//遍歷輸出  

    if(popStack(&S,&val))//判斷是否出棧成功  
    {  
        printf("出棧成功,出棧元素是%d\n",val);  
    }  
    else  
    {  
        printf("出棧失敗\n");  
    }  
    printf("出棧后遍歷輸出結果\n");  
    travelStack(&S);//遍歷輸出  
    clear(&S);  
    printf("再次遍歷下面為空白,說明清空成功!\n");  
    travelStack(&S);//遍歷輸出  

    return 0;  
}  

void initStack(PSTACK ps)//初始化棧,讓棧里面的兩個元素指向一個節點。  
{  
    ps->pTop=(PNODE)malloc(sizeof(NODE));  
    if(NULL==ps->pTop)  
    {  
        printf("動態內存分配失敗\n");  
        exit(-1);  
    }  
    else  
    {  
        ps->pBottom=ps->pTop;  
        ps->pTop->pNext=NULL;//等價于:ps->pBottom->pNext=NULL;也就是說下一次插入的空間是空的。也就是棧頂元素下一個是空的  
    }  
}  

void pushStack(PSTACK ps,int val)//壓棧函數  
{  
    PNODE pNew=(PNODE)malloc(sizeof(NODE));  
    pNew->data=val;  
    pNew->pNext=ps->pTop;//每次都把元素壓到棧頂  
    ps->pTop=pNew;  
}  

void travelStack(PSTACK ps)//遍歷棧  
{  
    PNODE p=ps->pTop;  

    while(p!=ps->pBottom)  
    {  
        printf("%d ",p->data);  
        p=p->pNext;  
    }  
    printf("\n");  
    return ;  
}  

bool empty(PSTACK ps)//判斷棧是否為空  
{  
    if(ps->pTop==ps->pBottom)  
    return true;  
    else  
    return false;  
}  

//把ps所指向的棧出棧一次,并把出棧的元素存入pVal形參所指向的變量中  
//如果出棧失敗,返回false,否則,返回true  
bool popStack(PSTACK ps,int* pVal)  
{  
    if(empty(ps))  
    {  
        return false;  
    }  
    else  
    {  
        PNODE r=ps->pTop;  
        *pVal=r->data;  
        ps->pTop=r->pNext;  
        free(r);  
        r=NULL;  
        return true;  
    }  
}  


//最后把棧清空。  
void clear(PSTACK ps)  
{  
    if(empty(ps))  
    {  
        return ;  
    }  

    else  
    {  
        PNODE p=ps->pTop;  
        PNODE q=NULL;  

        while(p!=ps->pBottom)  
        {  
            q=p->pNext;  
            free(p);  
            p=q;  
        }  

        ps->pTop=ps->pBottom;  
    }  

}  </pre> 


 本文由用戶 n42g 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!