链栈的基本操作

#25考研数据结构代码实践与回顾

一、定义

typedef struct Linknode{
    ElemType data;  //数据域
    struct Linknode *next;  //指针域
}*LiStack, StackNode;  //两者等价,前者表示一个链栈,后者表示一个结点

二、初始化

1. 带头结点

void InitStack(LinkStack &S){
    S = (StackNode *)malloc(sizeof(stackNode));  //创建头结点
    S->next = NULL; 
}

2. 不带头结点

void InitStack(LinkStack &S){
    S = NULL;
}

三、判空

1. 带头结点

bool stackEmpty(LinkStack S){
    return (S->next == NULL);
}

2. 不带头结点

bool stackEmpty(LinkStack S){
    return (S == NULL);
}

四、求链栈的长度

1. 带头结点

int stackLength(LinkStack s){
    stackNode* p = s->next;  //带头结点的链表第一个元素在头结点的下一个结点
    int length = 0;
    while(p != NULL){
        p = p->next;
        length++;
    }
    return length;
}

2. 不带头结点

int stackLength(LinkStack s){
    stackNode* p = s;
    int length = 0;
    while(p != NULL){
        p = p->next;
        length++;
    }
    return length;
}

五、新元素入栈

1. 带头结点

bool push(LinkStack &s, ElemType){
    stackNode *p = (stackNode *)malloc(sizeof(stackNode));
    p->data = x;
    p->next = s->next;
    s->next = p;
    return true;
}

2. 不带头结点

bool push(LinkStack &s, ElemType){
    stackNode *p = (stackNode *)malloc(sizeof(stackNode));
    p->data = x;
    if(s == NULL){  //当链表(栈)为空时
        p->next = NULL;
    }else{
        p->next = s;
    }
    s = p;
    return true;
}

六、元素出栈(通过x返回)

1. 带头结点

bool pop(LinkStack &s, ElemType &x){
    if(s->next == NULL) return false; //当链表为空时
    stackNode *p = s->next;
    x = p->data;
    s->next = p->next; //出栈
    free(p); //释放空间
    return true;
}

2. 不带头结点

bool pop(LinkStack &s, ElemType &x){
    if(s == NULL) return false; //当链表为空时
    stackNode *p = s;
    x = p->data;
    s = p->next; //出栈
    free(p); //释放空间
    return true;
}

七、返回栈顶元素

stackNode* GetTop(LinkStack s){
    if(stackEmpty(s)) return NULL;  //判空
    stackNode* p = (StackNode *)malloc(sizeof(stackNode));
    p->data = s->next->data;  //带头结点
    //不带头结点:p->data = s->data;
    p->next = NULL;
    return p;
}

八、销毁(不带头结点)

void DestroyStack(LinkStack &s){
    stackNode *p;  
    while(s != NULL){
        p = s;
        s = s->next;
        free(p);
    }
    s = NULL;
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值