链式存储实现栈(无头结点版)(c/c++)

简介部分:

    链栈的实现和单链表大同小异,不带头结点可以减少对指针指向的调整操作,更便于理解及实现栈这种操作受限线性表(只能从栈顶一端入栈出栈)的逻辑结构;

需要注意的几点是:
        1.链栈不需要判满,随用随申请;
        2.链栈为空时不能出栈,不能取栈顶;
        3.链式存储的栈比顺序存储的栈(包括顺序栈)对空间的利用率更高;

源代码展示:
 
以下是源代码:

#include<bits/stdc++.h>
using namespace std;
#define ElemType int
typedef struct LinkStackNode{
    ElemType data;
    struct LinkStackNode *next;
}LinkedStackNode,*LinkedStack;
//无头结点版
//初始化
void InitStack(LinkedStack &top){
    top = NULL;
}
//辅助函数--新建结点
LinkedStackNode * CreateNode(){
    LinkedStackNode *Node = (LinkedStackNode*) malloc(sizeof (LinkedStackNode));
    if(Node!=NULL) return Node;
}
//入栈(头插逆序入栈)
void Push(LinkedStack &top,ElemType x){
    LinkedStackNode *p = CreateNode();
    p->data = x;
    p->next = top;
    top = p;
}
//出栈(顺序扫描删除)
bool Pop(LinkedStack &top,ElemType &y){
    if(top==NULL) return false;
    y = top->data;//传回
    LinkedStackNode *q = top;//备份
    top = top->next;//栈顶--(逻辑删除)
    free(q);//回收内存(物理删除)
    return true;
}
//取栈顶
bool GetTop(LinkedStack top,ElemType &z){
    if(top==NULL) return false;
    z = top->data;
    return true;
}
int main(){
    //声明头指针
    LinkedStack top;
    //测试初始化
    InitStack(top);
    //测试入栈(1,2,3,4,5)
    for(int i = 1;i<=5;i++) Push(top,i);
    //测试取栈顶(5)
    int tmp;
    if(GetTop(top,tmp)) printf("StackTop:%d\n",tmp);
    //测试出栈(5,4) 新栈顶3
    for(int i = 1;i<=2;i++) if(Pop(top,tmp)) printf("Pop:%d\n",tmp);
    if(GetTop(top,tmp)) printf("StackTop_New:%d",tmp);
    return 0;
}





运行结果展示

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值