数据结构-栈-004

1链栈

运行结果如下:
在这里插入图片描述

1.1栈结点结构体定义

/*定义一个数据结构*/
typedef struct student
{
    char name[32];
    char sex;
    int age;
}DATA_TYPE;
/*定义一个栈结点*/
typedef struct stack_node
{
    DATA_TYPE data;//数据域
    struct stack_node *pnext;//指针域
}STACK_NODE;

1.2栈顶结点结构体定义

/*定义一个栈顶结点*/
typedef struct stack_top
{
    STACK_NODE *ptop;//栈顶结点指针域
    int clen;//栈顶结点数据域-栈结点数
}STACK_TOP;

1.3创建栈顶结点

/*==========创建栈顶结点(创建一个空栈)==========*/
STACK_TOP *create_stack_top(void)
{
    STACK_TOP *stack_top=NULL;

    /*申请一个栈顶结点空间*/
    stack_top=malloc(sizeof(STACK_TOP));
    if(NULL==stack_top)
    {
        perror("fail to malloc");
        return NULL;
    }

    /*栈顶结点成员初始化*/
    stack_top->ptop=NULL;
    stack_top->clen=0;

    return stack_top;
}

1.4创建栈结点

/*==========创建一个新的栈结点==========*/
STACK_NODE *create_stack_new_node(DATA_TYPE data)
{
    STACK_NODE *stack_node=NULL;

    /*申请一个栈结点空间*/
    stack_node=malloc(sizeof(STACK_NODE));
    if(NULL==stack_node)
    {
        perror("fail to malloc");
        return NULL;
    }

    /*栈结点成员初始化*/
    stack_node->data=data;
    stack_node->pnext=NULL;//思考1:这里直接初始化为NULL,还是继承栈顶的ptop?

    return stack_node;
}

1.5判断非空栈

/*==========判断是否为空栈==========*/
int is_empty_stack(STACK_TOP *pstack)
{
    return NULL==pstack->ptop;
}

1.6入栈

/*==========入栈-头插法==========*/
int push_stack(STACK_TOP *pstack,STACK_NODE *pnode)
{
#if 0
	if (NULL == pstack || NULL == pnode)
	{
		return -1;
	}
#endif

    if(is_empty_stack(pstack))
    {
        pstack->ptop=pnode;//更新栈顶指针域
    }
    else
    {
        pnode->pnext=pstack->ptop;//初始化新的栈结点指针域
        pstack->ptop=pnode;//更新栈顶指针域
    }

    pstack->clen++;//更新栈顶结点数据域

    return 0;
}

1.7出栈

/*==========出栈-头删法==========*/
int pop_stack(STACK_TOP *pstack,DATA_TYPE *data)
{
    STACK_NODE *ptmp=NULL;

#if 0
	if(NULL==pstack)
	{
		return -1;
	}
	if(is_empty_stack(pstack))
    {
        return -1;
    }
#endif

    if(is_empty_stack(pstack))
    {
        return -1;
    }

    ptmp=pstack->ptop;//初始化栈结点类型的中间指针变量为栈首
    pstack->ptop=ptmp->pnext;//更新栈顶指针域

    if(data!=NULL)
    {
        *data=ptmp->data;//数据出栈,主调函数中定义变量接收出栈数据
    }

    free(ptmp);

    pstack->clen--;

    return 0;
}

1.8遍历栈

/*==========遍历栈==========*/
void stack_for_each(STACK_TOP *pstack,void (*pfun)(STACK_NODE *))
{
    STACK_NODE *ptmp=NULL;

    ptmp=pstack->ptop;//初始化栈结点类型的中间指针变量为栈首
    while(1)
    {
        if(NULL==ptmp)
        {
            break;
        }

        pfun(ptmp);
        ptmp=ptmp->pnext;
    }
}

/*==========遍历方法==========*/
void show_data(STACK_NODE *pnode)
{
    printf("%-10s\t%-10c\t%-10d\n",pnode->data.name,pnode->data.sex,pnode->data.age);
}

1.9获取栈顶

/*==========获取栈顶==========*/
int get_stack_top(STACK_TOP *pstack,DATA_TYPE *data)
{
    if(is_empty_stack(pstack))
    {
        return -1;
    }

    *data=pstack->ptop->data;//栈顶数据出栈

    return 0;

#if 0
    if(data!=NULL)
    {
        *data=pstack->ptop->data;
        return 0;
    }

    return -1;
#endif
}

1.10清空栈

/*==========清空栈==========*/
void clear_stack(STACK_TOP *pstack)
{
    while(1)
    {
        if(is_empty_stack(pstack))
        {
            break;
        }
        else
        {
            pop_stack(pstack,NULL);
        }
    }
}

1.11销毁栈

/*==========销毁栈==========*/
void destroy_stack(STACK_TOP *pstack)
{
    clear_stack(pstack);
    free(pstack);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值