无头结点的链栈

/*链栈*/
/*链栈的结构和各种基本操作都类似于线性链表
*只是要注意它的插入和删除操作只能在栈顶进行
*为了方便操作,我们将链表的头部作为栈顶
*/
#include<stdio.h>
#include<stdlib.h>

//结构定义
typedef struct node
{
    elementType data;
    struct node *next; 
} LSNode;//链栈节点 
typedef struct
{
    struct LSNode *top;
    int size;
}*PSTACK;//链栈 
typedef int elementType;

//基本操作
//注意:配合CreatStack(),应该有DisposeStack(PSTACK) 
 PSTACK CreatStack()
 {
     PSTACK p=NULL;
    p=(PSTACK)malloc(sizeof(*PSTACK));
     if(p==NULL)
     {
         printf("Cannot malloc for PSTACK\n");
         //根据内存分配失败,业务是否还能进行选择 
        //return NULL;
        exit(1); 
    }
    else
    {
        p->top=NULL;
        p->size=0;
        return p;
    }
 }
 int IsEmpty(PSTACK s)
 {
     if(s==NULL)
         return 1;
    else
        return 0;
 }
 void PopStack(PSTACK s)//出栈 
 {
     if(IsEmpty(s))
     {
        printf("Stack is Empty\n");
    }
    else
    {
        LSNode*p=NULL;
         p=s->top->next;
         free(s->top);
         s->top=p;
         s->size--;
    }
 }
 void MakeEmptyStack(PSTACK s)//清空栈 
 {
     while(s->top!=NULL)
    {
        //PopStack()中有重复判断,不爽大可以重写
        PopStack(s);  
    }
 }
 void DisposeStack(PSTACK s)//删除栈 
{
     MakeEmptyStack(s);
     free(s);
}
void PushStack(elementType x, PSTACK s)//压栈,入栈 
{
    LSNode*p=NULL;
    p=(LSNode*)malloc(sizeof(LSNode));
    if(p==NULL)
    {
        printf("Cannot malloc for LSNode\n");
        //根据内存分配失败,业务是否还能进行选择 
        //return NULL;
        exit(1);
    } 
    p->data=x;
    p->next=s->top;
    s->top=p;
    s->size++;
}
elementType TopStack(PSTACK s)//取栈顶元素
{
    if(s->top==NULL)
        return NULL;
    else 
        return s->top->data;
}
elementType TopAndPop(PSTACK s)//取栈顶元素,并出栈(栈空时返回NULL)
{
    //因为使用此函数前提是已经判断了栈非空,这里不做重复判断
    elementType x;
    x=TopStack(s);
    PopStack(s);
    return x; 
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页