链式栈的基本操作(入栈、出栈、……)

链式栈

LinkStack.h

#ifndef __LINKSTACK_H__
#define __LINKSTACK_H__
#define elemnet int

typedef struct SNode
{
    element data;			//保存栈中的一个元素
    struct SNode *next;
    struct SNode *prev;
}SNode;

typedef struct LinkStack
{
    SNode *first;			//栈底指针
    SNode *top;				//栈顶指针
    int Nodenum;			//元素个数
}LinkStack;

/*
	功能:初始化链式栈
	返回值:链式栈的头结点
*/
LinkStack *InitStack(void);

/*
	功能:入栈
	返回值:1--成功;0--失败
*/
int push(LinkStack *s,element x);

/*
	功能:出栈
	返回值:1--成功;0--失败
*/
int pop(LinkStack *s,element *e);

/*
	功能:获取栈顶元素
	返回值:1--成功;0--失败
*/
int GetTop(LinkStack* s, element *e);

/*
	功能:清空链式栈,释放所有的数据结点
	参数:头指针
*/
void clearlinkstack(LinkStack *s);

/*
	功能:销毁链式栈
	参数:头指针
*/
void destroylinkstack(LinkStack *s);

/*
	功能:判断链式栈是否为空
	参数:头指针
*/
int StackIsEmpty(LinkStack *s);

/*
	功能:打印链式栈
	参数:头指针
*/
void printStack(LinkStack *S);

#endif

LinkStack.c

#include<stdio.h>
#include<stdlib.h>
#include"LinkStack.h"

/*
	功能:初始化链式栈
	返回值:链式栈的头结点
*/
LinkStack *InitStack(void)
{
    LinkStack *l = malloc(sizeof(*l));
    l->first = NULL;
    l->top = NULL;
    l->Nodenum = 0;
    return l;
}

/*
	功能:入栈
	返回值:1--成功;0--失败
*/
int push(LinkStack *s,element x)
{
    if(s == NULL)
    {
        return 0;
    }
    SNode *p = malloc(sizeof(*p));
    if(p == NULL)
    {
        return 0;
    }
    p->data = x;
    p->next = p->prev = NULL;
    if(s->top == NULL)
    {
        s->top = p;
        s->first = p;
    }
    else
    {
        s->top->next = p;
        p->prev = s->top;
        s->top = p;
    }
    s->Nodenum++;
    return 1;
}

/*
	功能:出栈
	返回值:1--成功;0--失败
*/
int pop(LinkStack *s,element *e)
{
    if(s == NULL || s->Nodenum == 0)
    {
        return 0;
    }
    *e = s->top->data;
    SNode *px = s->top;
    if(s->Nodenum == 0)
    {
        s->first = NULL;
        s->top = NULL;
        free(px);
    }
    else
    {
        s->top = px->prev;
        px->prev->next = NULL;
        px->prev = NULL;
        free(px);
    }
    s->Nodenum--;
    return 1;
}


/*
	功能:获取栈顶元素
	返回值:1--成功;0--失败
*/
int GetTop(LinkStack* s, element *e)
{
	if (s == NULL || s->Nodenum == 0)
	{
		return 0;
	}

	*e = s->top->data;
	printf("%d\n",*e);
	return 1;

}

/*
	功能:清空链式栈,释放所有的数据结点
	参数:头指针
*/
void clearlinkstack(LinkStack *s)
{
	if(s == NULL || s->top == NULL)
	{
		return;
	}
	SNode *p = s->first;
	while(p)
	{
		s->first = p->next;
		if(p->next)
		{
			p->next->prev = NULL;
		}
		p->next = NULL;
		free(p);
		p = s->first;
	}
	s->top = NULL;
	s->Nodenum = 0;
	return;
}
/*
	功能:销毁链式栈
	参数:头指针
*/
void destroylinkstack(LinkStack *s)
{
	if(s == NULL)
	{
		return;
	}
	clearlinkstack(s);
	free(s);
}


/*
	功能:判断链式栈是否为空
	参数:头指针
*/
int StackIsEmpty(LinkStack *s)
{

	if (s == NULL || s->Nodenum == 0)
	{
		return 1;
	}

	return 0;
}

/*
	功能:打印链式栈
	参数:头指针
*/
void printStack(LinkStack *S)
{
	SNode *p = S->top;//遍历指针
    while (p)
    {
        
        printf("%d ", p->data);
		p = p->prev;
    }
    printf("\n");
}

main.c

#include<stdio.h>
#include<stdlib.h>
#include"LinkStack.h"

int main()
{
	LinkStack *s = InitStack();
	element x,e;
	printf("请输入数据,以0结尾\n");
	
	while(1)
	{
		scanf("%d",&x);
		if(x == 0)
		{
			break;
		}
		push(s,x);
		GetTop(s,&e);
	}
	printStack(s);
	return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值