关于栈的建立,入栈,出栈,遍历,清空等操作

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

typedef struct Node{
    int data;//数据域
    struct Node * pNext;
}NODE,*PNODE;

typedef struct Stack{
    PNODE pTop;//指向栈的顶部节点
    PNODE pBottom;//指向栈的底部节点
}STACK,* PSTACK;

//函数声明
void init(PSTACK);//初始化一个空栈,使pTop和pBottom都指向头结点
void push(PSTACK,int);//存元素,压栈
void traverse(PSTACK);//遍历
bool pop(PSTACK,int *);//出栈并且返回出栈元素,还要判断出栈是否成功
bool empty(PSTACK);//判断栈是否为空
void clear(PSTACK);//清空数据

int main(){
    STACK S;//等价于struct Stack S,分配一块内存空间名为S
          //里面有pTop和pBottom,暂时是垃圾值
   int val;       

    init(&S);//初始化一个空栈,使pTop和pBottom都指向头结点
    push(&S,1);//存元素,压栈
     push(&S,2);//存元素,压栈     
    traverse(&S);//遍历
    clear(&S);//清空

    if(pop(&s,&val)){//删元素,出栈
        printf("出栈成功,出栈元素的是%d\n",val);
    }
    else{
        printf("出栈失败");
    }

    return 0;
}

void init(PSTACK pS){
    pS->pTop = (PNODE)malloc(sizeof(NODE));

    if(pS->pTop==NULL){
        printf("动态内存分配失败");
        exit(-1);//程序终止
    }
    else{
        pS->pBottom=pS->pTop;//空栈情况下,栈顶和栈底都指向同一个地址
        //即最后一个有效节点的下一个节点
        pS->pTop->pNext=NULL;//pS->pBottom->pNext==NULL
        //pS的成员pTop指向的头结点的指针域为空
    }
}

void push(PSTACK pS,int val){
    PNODE pNew = (PNODE)malloc(sizeof(NODE));//创建新结点
    pNew->data = val;
    pNew->pNext = pS->pTop;//使新节点的指针域指向原来的栈顶节点,
                           //不能是ps->pBottom
    pS->pTop = pNew;//使栈顶指向新节点地址

    return ;
}

void traverse(PSTACK pS){
    PNODE p = pS->PTop;//临时指针指向栈顶
    while(p != pS->pBototm){//若p还没有栈底pBottom,则遍历输出
        printf("%d ",p->data);//从栈顶开始输出
        p=p->pNext;
    }
    printf("\n");
    return ;
}

bool empty(PSTACK pS){
    if(pS->pTop == pS->pBottom) return true;//当栈底和栈顶指向同一块地址,为空栈
    esle return false;
}

//把pS所指向的栈出栈一次,并把出栈的元素存入val形参所指向的变量中,
//出栈成功返回true,失败返回false
bool pop(PSTACK pS,int * val){
    if(empty(pS)) return false;
    els{
        *val = pS->data;//主函数里输出出栈元素
        PNODE r = pS->pTop;//临时指针r指向出栈元素位置:栈顶,方便最后释放内存
        ps->pTop = r->pNext;//栈顶指针指向原来栈顶的下一个节点地址
        free(r);
        r = NULL;
        return true;
    } 
}

void clear(PSTACK pS){//清空数据,最终使栈顶和栈底指向同一个地址
        if(empty(pS)){//如果栈本身为空,不需要清空
            return ;
        }
        else{
            PNODE p = pS->pTop;//临时指针P指向栈顶
            PNODE q = NULL;//临时指针q暂时设为NULL
            while(p != pS->pBottom){//当栈顶指针不指向栈底时,栈不为空
                q = p->pNext;//临时指针q指向下一个节点
                free(p);//释放p的内存
                p = q;//再使p指向下一节点地址
            }
        }
    pS->pTop = pS->pBottom;//最后数据全部清空,栈顶和栈底指向同一个地址
}