类C语言--链栈的基本操作:初始化,进栈,出栈,判空,取栈顶元素,求结点个数

此代码可以正常运行,是实实在在的类C语言

//链栈:运算是受限的单链表,只能在链表头部进行操作,所以没有必要附加头结点。栈顶指针就是的头指针
#include
#include
typedef int SElemType;
typedef struct StackNode
{
	SElemType data;
	struct StackNode *next;
}StackNode,*LinkStack;
enum Status{ERROR,OK};

//链栈初始化   S---->^
Status InitStack(LinkStack &S)
{
	S=NULL;       //S为空指针;; 没有任何指向:野指针  不允许!
	return OK;
}

//判断链栈是否为空
Status StackEmpty(LinkStack S)
{
	if(S==NULL)
		return OK;
	else
		return ERROR;
}

//链栈进栈
Status Push(LinkStack &S,SElemType e)
{
	LinkStack p=new StackNode;  //生成新结点p
	if(!p)
		return ERROR;  //exit(OVERFLOW);  跳到Windows操作系统
	p->data=e;         //没有栈满不满这一说法,因为不是连续的
	p->next=S;
	S=p;
	return OK;
}

//链栈结点个数
int Num(LinkStack S)
{
	int n=0;
	LinkStack p=S;
	while(p)
	{
		n++;
		p=p->next;
	}
	return n;
}

//链栈出栈
Status Pop(LinkStack &S,SElemType &e)
{
	LinkStack p=S;
	if(S==NULL)
		return ERROR;
	e=S->data;
	p=S;
	S=S->next;
	delete p;
	return OK;
}

//取链栈栈顶元素
SElemType GetTop(LinkStack S)
{
	if(S==NULL)
		return ERROR;
	else
		return S->data;
}

int main()
{
    LinkStack S;
	SElemType e;
	int n,a;
	InitStack(S);

	printf("输入元素个数\n");
	scanf("%d",&n);
	printf("输入元素\n");
	for(int i=0;i<n;i++)
	{
		scanf("%d",&e);
		Push(S,e);
	}

	printf("链栈结点个数为:%d\n",Num(S));
	
	a=GetTop(S);
    printf("栈顶元素为 %d\n",a);

    printf("输出元素\n");
	while(!StackEmpty(S))
	{
		Pop(S,e);
		printf("%d  ",e);
	}

    
	return 0;
}




你可能感兴趣的:(栈)