数据结构栈(链式实现)

本文详细介绍了链式栈的实现方式,包括初始化、判断是否为空、压栈、弹栈和获取栈顶元素等基本操作。通过实例代码演示了如何在实际场景中运用链式栈解决具体问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

真正的栈操作是在栈顶,这里给出的栈是带了头结点的栈,也就是说head->next代表图示栈顶,head->next->data是1


代码实现:

#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct snode
{
    DataType data;
    struct snode *next;
}LSNode;

/*初始化带头结点的链式堆栈,初始化函数中不应该给head指针重新赋新地址,

因为这样会导致外部传入的头节点地址没有被使用,而是初始化函数内部找了个

内存地址,并给该内存地址上变量的next指针域赋值NULL,

而外部的(main函数里的)头结点的next指针域仍然是系统分配随机值

会导致StackNotEmpty函数判断栈任何时候都非空*/

void StackInitiate(LSNode *head)
{
  head->next = NULL;
}

/*判断栈是不是空栈,如果是空栈则返回0,是非空栈则返回1,其实判断的是头结点指向的栈顶节点是否为空

栈顶空,表明栈是空栈*/
int StackNotEmpty(LSNode *head)
{
    if(head->next == NULL) return 0;
    else return 1;
}
/*把数据元素x插入到链式堆栈head的栈顶作为新的栈顶*/
int StackPush(LSNode *spu, DataType x)
{
    LSNode *p;
    if((p = (LSNode *)malloc(sizeof(LSNode))) == NULL)
    {
        printf("内存空间不足无法插入!\n");
        return 0;
    }

    p->data = x;
    p->next = spu->next; /*新结点链入栈顶*/
    spu->next = p;
    return 1;
}

int StackPop(LSNode *spo, DataType *d)
{
    LSNode *p;
    p = (LSNode*)malloc(sizeof(LSNode));
    p = spo->next;
    if(p == NULL)
    {
        printf("堆栈已空出错!");
    }
    *d = p->data;
    spo->next = p->next;
    free(p);
    return 1;
}

/*获取栈顶元素*/
int StackTop(LSNode *head, DataType *d)
{
    LSNode *p = head->next;
    if(p == NULL)
    {
        printf("堆栈已空出错!\n");
    }
    *d = p->data;
    return 1;
}
int main()
{
    LSNode *stack;
    stack = (LSNode *)malloc(sizeof(LSNode));
    StackInitiate(stack);
    DataType d1 = 1;
    DataType d2 = 2;
    DataType d3 = 3;
    StackPush(stack, d1);
    printf("栈中压入:%d\n", d1);
    StackPush(stack, d2);
    printf("栈中压入:%d\n", d2);
    StackPush(stack, d3);
    printf("栈中压入:%d\n", d3);

    DataType *d4, *d5, *d6;
    d4 = (DataType *)(malloc(sizeof(DataType)));
    d5 = (DataType *)(malloc(sizeof(DataType)));
    d6 = (DataType *)(malloc(sizeof(DataType)));
    
    StackPop(stack, d4);
    printf("栈中弹出:%d\n", *d4);
    StackPop(stack, d5);
    printf("栈中弹出:%d\n", *d5);
    StackPop(stack, d6);
    printf("栈中弹出:%d\n", *d6);
    getchar();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值