链栈的实现

本文介绍了一种基于链表实现的栈数据结构——链栈,并提供了详细的C语言代码实现。文章详细解释了链栈的基本操作,包括初始化、入栈、出栈、获取栈顶元素、判断栈是否为空等。

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

解释:
由于链表有头指针,而栈也必须有头指针,所有合二为一
链栈为空的条件为头指针为空,头指针存储在一个新的结构体中。
这里写图片描述

#include <iostream>
using namespace std;
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int SElemType;
typedef int Status;
typedef struct StackNode
{
        SElemType data;
        struct StackNode * next;
}StackNode,*LinkStackPtr;


typedef struct
{
        LinkStackPtr top;
        int count;
}LinkStack;                                  //如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体
                                             //名定义其他变量,那么在定义时也可以不给出结构体名
Status init_List(LinkStack * link){
    link->top = (LinkStackPtr)malloc(sizeof(LinkStack));
    if(link->top==NULL){
        return ERROR;
    }else{
        link->count = 0;                       //链栈为空的条件为指向链栈的头指针为NULL,
                                               //即栈顶指针为空,链栈没有头结点,栈顶指针和
        link->top = NULL;                       //头指针为同一个
        return OK;
    }

}
Status Push(LinkStack *S,SElemType e){
    LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
    s->data = e;
    s->next = S->top;                            //栈结构只能在栈顶操作,增加新元素的Next指向
                                                //原来的栈顶元素
    S->top = s ;                                //成为新的栈顶元素
    S->count++;
}
Status isEmpty(LinkStack link){
    if(link.top == NULL)
        return TRUE;
    else
        return FALSE;
}
Status Pop(LinkStack *S,SElemType *e){
    if(isEmpty(*S))
        return ERROR;
    *e = S->top->data;
    LinkStackPtr s = S->top;
    S->top = S->top->next;
    free(s);
    S->count--;
}

int ListLength(LinkStack s){
    if(isEmpty(s))
        return FALSE;
    return s.count;
}

Status Get_Top(LinkStack s, SElemType *e){
    if(isEmpty(s))
        return FALSE;
    *e = s.top->data;
    return OK;
}

Status ClearStack(LinkStack *s){
    if(isEmpty(*s))
        return FALSE;
    LinkStackPtr p = s->top;
    LinkStackPtr q;
    while(p){
        q = p->next;
        free(p);
        p = q;
    }
    s->count = 0;
    s->top = NULL;
}
int main()
{
    LinkStack s;
    printf("链栈是否初始化成功%d\n",init_List(&s));
    Push(&s,3);
    Push(&s,2);
    Push(&s,1);
    LinkStackPtr p = s.top;
    printf("从栈顶开始\n");
    while(p){
        printf("%d\n",p->data);
        p = p->next;
    }
    int result;
    p = s.top;
    while(p){
        Pop(&s,&result);
        printf("删除的元素依次为%d\n",result);
        p = s.top;
    }
    Push(&s,3);
    Push(&s,2);
    Push(&s,1);
    Push(&s,3);
    Push(&s,2);
    Push(&s,1);
    printf("链表的长度为%d\n",ListLength(s));
    int value;
    printf("取回栈顶的值%d\n",Get_Top(s,&value));
    ClearStack(&s);
        printf("清空栈后,栈空否:%d(1:空 0:否)\n",isEmpty(s));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值