首页 > 其他分享 >栈2: 链式存储

栈2: 链式存储

时间:2024-04-18 19:55:07浏览次数:32  
标签:LinkStack 存储 return head next 链式 NULL stack

栈2: 栈的链式存储


栈的结点

//链式栈的结点
typedef struct LINKNODE{
    struct LINKNODE *next;
} LinkNode;

链式栈的结构

//链式栈
typedef struct LINKSTACK{
    LinkNode head;
    int size;
} LinkStack;

栈的初始化

LinkStack* Init_LinkStack(){
    LinkStack *stack = (LinkStack*)malloc(sizeof(LinkStack));
    stack->head.next = NULL;
    stack->size=0;
    //返回栈顶
    return stack;
};

入栈(头插法)

//栈是先进后出, 头插法更加适合
void Push_LinkStack(LinkStack* stack, LinkNode *data){
    if(stack==NULL) return;
    if(data==NULL) return;
    data->next = stack->head.next;
    stack->head.next = data;
    stack->size++;
};

返回栈顶元素

LinkNode* Top_LinkStack(LinkStack* stack){
    if(stack==NULL) return NULL;
    if(stack->size==0) return NULL;
    return stack->head.next;
};

出栈(删除第一个元素)

void Pop_LinkStack(LinkStack* stack){
    if(stack==NULL) return;
    if(stack->size==0) return;    
    LinkNode *curNode = stack->head.next;

    stack->head.next =  stack->head.next->next;
    curNode->next = NULL;
    free(curNode);

    stack->size--;
};

返回栈元素个数

int Size_LinkStack(LinkStack* stack){
    if(stack==NULL) return -1;
    return stack->size;
};

清空

void Clear_LinkStack(LinkStack* stack){
    if(stack==NULL) return;
    stack->head.next = NULL;
    stack->size = 0;
};

销毁

void FreeSpace_LinkStack(LinkStack* stack){
    if(stack==NULL) return;
    free(stack);
};

测试

自定义栈结构

typedef struct PERSON{
    LinkNode node;    
    char name[64];
    int age;
} Person;

测试

int main(){
    //初始化栈
    LinkStack *stack = Init_LinkStack();
    //创建数据
    Person p1,p2,p3;
    //strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
    strcpy(p1.name, "aaa");
    strcpy(p2.name, "bbb");
    strcpy(p3.name, "ccc");
    p1.age = 10;
    p2.age = 20;
    p3.age = 30;
    //入栈
    Push_LinkStack(stack, (LinkNode*)&p1); //进行类型的强制转换
    Push_LinkStack(stack, (LinkNode*)&p2);
    Push_LinkStack(stack, (LinkNode*)&p3);
    //输出
    while(Size_LinkStack(stack)>0){
        //取出栈顶元素
        Person *p = (Person*)Top_LinkStack(stack);
        cout << p->name << " " << p->age << endl;
        //弹出栈顶元素
        Pop_LinkStack(stack);
    }
    //销毁栈
    FreeSpace_LinkStack(stack);


    system("pause");
    return 0;
}

标签:LinkStack,存储,return,head,next,链式,NULL,stack
From: https://www.cnblogs.com/HIK4RU44/p/18144290

相关文章

  • 7-03. 实现数据存储和加载的逻辑
    给NPC增加GUIDNPC_Girl02和NPC_Girl01也同样增加DataGUID修改NPCMovement创建DataSlot修改SaveLoadManagerpersistentDataPath对应的文件路径暂时先不写UI,用键盘来进行交互修改TransitionManager卸载UI场景修改TransitionManager......
  • swift通过Mirror访问对象所有的存储属性
    Mirror用途:获取到对象的全部属性的key、value。示例:点击查看代码classPerson{privatevarname:Stringprivatevarage:Intvaraddress:StringvarsaySomething:String{return"helloworld"}init(name:String,age:Int,address:Stri......
  • 智慧煤矿/智慧矿区视频汇聚存储与安全风险智能分析平台建设思路
    一、建设背景目前我国非常重视煤矿安全生产,并投入大量资金用于煤矿安全综合远程监控系统的研发。视频监控系统作为实现煤矿智能化无人开采的关键系统与煤矿安全生产的多系统协同分析与处理的关键信息源,在智慧矿山管控平台的建设中发挥着重要的作用。作为全矿区的视频整合平台,是......
  • 7-02.创建游戏数据存储结构框架
    安装Newtonsoft-jsoncom.unity.nuget.newtonsoft-json创建GameSaveData创建ISaveable创建SaveLoadManager修改ISaveable创建DataGUID修改ISaveable给Player绑定GUID运行,然后停止,然后再运行,这时GUID就一直存在了修改Player脚本给所有Ma......
  • c++ std::string能否存储二进制字符以及'\0'字符?
    c++的字符串类std::string能否存储二进制字符以及字符'\0'?要解决这个问题,我们首先要了解c++的std::string的存储结构。(注意不同的平台下C++规范对std::string的实现不完全一致,例如sizeof(std::string)在linuxx64gcc-4.4下的输出是8,而在macgcc4.2下的输出是24;这篇文章以Li......
  • 海康威视添加NAS存储
    1、关闭防火墙iptables-Fsetenforce0systemctlstopfirewalldsystemctldisablefirewalld2、创建目录mkdir-p/data/HaiKangData3T3、格式化硬盘mkfs.xfs/dev/sdb-f4、挂载blkidvim/etc/fstabUUID="5faf3a9b-fc2a-483b-a3ae-f0e00717a233/data/HaiKangData3T......
  • golang etcd键值存储系统
    目录存储配置文件watch命令在Go语言中,etcd是一个高可用的键值存储系统,它主要用于共享配置和服务发现。etcd由CoreOS团队开发,它是Kubernetes项目中用于存储所有集群数据的关键组件。etcd使用Raft协议来保持集群之间的数据一致性,并且提供了强一致性保证https://blog.csdn.net/jo......
  • MySQL存储引擎
    MySQL存储引擎存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以称为表类型。查看存储引擎showengines;查看数据库默认存储引擎showvariableslike'%storage_engine%';MySQL存储引擎特性MySQL5.5之前......
  • MySQL存储过程与函数
    MySQL存储过程与函数存储过程创建、调用、删除创建CREATEPROCEDURE存储过程名(参数列表)BEGIN--SQL语句END;调用CALL存储过程名(参数值);删除DROPPROCEDUREIFEXISTS存储过程名;函数创建、调用、删除创建CREATEFUNCTION函数名(参数列表)RETURNS返......
  • C:\Windows\servicing\Packages 是一个存储 Windows 更新程序包的目录。Windows 操
    C:\Windows\servicing目录包含了与Windows维护和更新相关的文件和子目录。让我们逐个解释一下每个子目录和文件的作用:CbsApi.dll和CbsMsg.dll:这两个DLL文件是Windows组件基础服务(CBS)的一部分。CBS是Windows中用于安装、卸载、维护和更新组件的服务。这些D......