栈的建立和一些基本操作

栈作为一种数据结构,由线性表演变而来,具有后进先出特性,有顺序储存和链式储存两种写法,这里写的是链式储存


#include<stdio.h>

#include<stdlib.h>
typedef int ElementType;


struct Node
{
ElementType Element;

struct Node *Next;
};


typedef struct Node   *PtrToNode;
typedef PtrToNode Stack;


int IsEmpty( Stack S); //判断栈是否为空
Stack CreatStack(void); //创建空栈
void MakeEmpty(Stack S); //清空栈
int Push(ElementType X,Stack S); //入栈
ElementType Top(Stack S); //栈顶元素
ElementType Pop(Stack S); //出栈
int SizeToStack(Stack S); //栈的大小
void  DestoryStack(Stack *S);


int main(void)
{
Stack S = NULL;

S = CreatStack();

// Push(12,S);
// Push(45,S);
// Push(78,S);
// Push(65,S);

// Pop(S);
// Pop(S);

// MakeEmpty(S);

DestoryStack(&S);


// Push(65,S);

// Pop(S);
printf("%d",IsEmpty(S));

printf("The Top is %d\n",Top(S));

printf("The Size is %d",SizeToStack(S));



return 0;
}


int IsEmpty( Stack S)
{
if(!S) // 如果S为NULL,表明没有建立栈
{
printf("Please Creat a Stack First\n");
return 1;
}
else
return NULL == S->Next ; //如果头指针的Next为NULL 表明栈空
}




Stack CreatStack(void)
{
Stack S;

S = (Stack) malloc(sizeof(Node));

if(!S)
{
printf("CreatStack Out Of Space\n");
return NULL;
}
else
{
S->Element = 0; //建立一个空栈,头结点的元素值为栈的大小,返回头结点指针
S->Next = NULL;
return S;
}
}


void MakeEmpty(Stack S)
{
if(NULL == S) //如果S为NULL,表明栈还没有建立
{
printf("S is NULL\n");
}
else
{
while( !IsEmpty(S)) //否则清空栈
{
Pop(S);
}
}

S->Element = 0;
}


int Push(ElementType X,Stack S)
{
Stack P;

if(!S) //如果S为NULL,表明栈还没有建立
{
printf("Please Creat A Stack\n");
return 0;
}

P = (Stack)malloc(sizeof(struct Node));
P->Next =NULL;
if(!P)
{
printf("Push Out Of Space\n");
}
else
{
P->Element = X;
P->Next = S->Next;
S->Next = P;
}

S->Element++;

return 1;
}


ElementType Top(Stack S) //返回栈顶元素
{
Stack P;
if(!IsEmpty(S))
P = S->Next;
else return 0;

return P->Element;
}




ElementType Pop(Stack S) //出栈
{
ElementType X = 0;
PtrToNode P;

if(!IsEmpty(S))
{
P = S->Next;
X = P->Element;
S->Next = S->Next->Next;
free(P);
S->Element--;
}
else
{
printf("Stack Is Empty\n");
}



return X;
}


int SizeToStack(Stack S)
{
if(!S) //如果S为NULL,表明栈还没有建立
{
printf("Please Creat a Stack First\n");
return 0;
}
else
return S->Element;
}


void  DestoryStack(Stack *S) //销毁栈,传入地址是为了使S等于NULL
{
PtrToNode P,tmp;

P = *S;
*S = NULL;


while(P->Next)
{
tmp = P;
P = P->Next;
free(tmp);
}

free(P);
}



全部评论

相关推荐

牛客464620405号:随便投,随便找,中国经过40多年的改革开放,人才缺口和职位空缺是巨大的,中国现在属于遍地黄金的年代,属于90后和00大机遇的时代
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务