1. 程式人生 > >鏈棧的常用操作(初始化,入棧,出…

鏈棧的常用操作(初始化,入棧,出…

#include
#include

typedef struct Node
{
    int data;
    struct Node *pNext;
}NODE, *PNODE;

typedef struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK, *PSTACK;

void init_stack(PSTACK);//初始化鏈棧
void push_stack(PSTACK,int);//元素入棧
void is_empty_stack(PSTACK);//判斷棧是否為空
void traverse_stack(PSTACK);//遍歷棧
void pop_stack(PSTACK);//元素出棧
void clear_stack(PSTACK);//清空棧

int main(int argc, const char * argv[])
{
    STACK S;
    
    init_stack(&S);
    push_stack(&S,1);
    push_stack(&S,2);
    printf("棧中的元素為:");
    traverse_stack(&S);
    
    pop_stack(&S);
    printf("棧中的元素為:");
    traverse_stack(&S);
    
    clear_stack(&S);
    printf("棧中的元素為:");
    traverse_stack(&S);
    
    return 0;
}

//初始化鏈棧
void init_stack(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 push_stack(PSTACK pS,int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    
    pNew->data = val;
    pNew->pNext = pS->pTop;
    pS->pTop = pNew;
    
    return;
}


void is_empty_stack(PSTACK pS)
{
    if (pS->pTop == pS->pBottom) {
        
        printf("棧為空!!!\n");
        exit(-1);
    }
    
    return;
}


//遍歷棧
void traverse_stack(PSTACK pS)
{
    is_empty_stack(pS);
    
    PNODE pNew = pS->pTop;
    while (pNew != pS->pBottom) {
        
        printf("%d ", pNew->data);
        
        pNew = pNew->pNext;
    }
    printf("\n");
    
    return;
}

//元素出棧一次,並把出棧的元素存入pVal所指向的變數中
void pop_stack(PSTACK pS)
{
    is_empty_stack(pS);
    
    int pVal;
    pVal = pS->pTop->data;
    pS->pTop = pS->pTop->pNext;
    
    printf("出棧的元素為:%d\n",pVal);
    
    return;
}

//清空棧
void clear_stack(PSTACK pS)
{
    is_empty_stack(pS);
    
    PNODE p = pS->pTop;
    PNODE q = NULL;