栈的链式存储(详解)

栈的链式存储

栈的链式存储是通过链表来实现的,每个节点包含一个元素和一个指向下一个节点的指针。链式存储的栈不需要提前分配内存空间,可以动态地增加或减少元素。

在链式存储中,栈顶元素通常是链表的头节点,栈底元素是链表的末尾节点。通过链表的插入和删除操作,可以轻松实现栈的基本操作:

  1. 入栈操作(push):创建一个新节点,将新元素放入节点中,然后将新节点插入链表的头部,成为新的栈顶节点。
  2. 出栈操作(pop):将链表头部的节点取出,并将头指针指向下一个节点,成为新的栈顶节点。
  3. 栈空判断:当链表为空时,表示栈为空。
  4. 栈满判断:链式存储的栈一般不会满,除非内存耗尽。

链式存储的栈操作灵活,但由于每个节点需要额外的指针空间,可能会占用更多的内存。另外,由于链式存储的特性,访问栈中特定位置的元素可能需要遍历整个链表,导致性能略低于顺序存储。

线性表的链式存储:受到限制的线性表

栈的链式存储项目结构

链式存储的头文件LinkedStorage.h
头文件LinkedStorage.h代码

cpp 复制代码
#ifndef LINKSTACK_H
#define LINKSTACK_H
#include <stdio.h>
#include <stdlib.h>
// 链式栈的节点
typedef struct LINKNODE {
	struct LINKNODE* next;
}LinkNode;
// 链式栈
typedef struct LINKSTACK {
	LinkNode head;
	int size;

}LinkStack;


// 初始化函数
LinkStack* Init_LinkStack();
// 入栈
void Push_LinkStack(LinkStack* stack, LinkNode* data);
// 出栈
void Pop_LinkStack(LinkStack* stack);
// 返回栈顶元素
LinkNode* TopLinkStack(LinkStack* stack);
// 返回栈元素的个数
int Size_LinkStack(LinkStack* stack);
// 清空栈
void Clear_LinkStack(LinkStack* stack);
// 销毁栈
void FreeSpace_LinkStack(LinkStack* stack);
#endif

c语言文件代码LinkedStorage.cpp
cpp代码

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "LinkedStorage.h"

// 初始化函数
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++;
};
// 出栈
void Pop_LinkStack(LinkStack* stack) {
    if (stack == NULL) {
        return;
    }
    if (stack->size == 0) {
        return;
    }

    // 第一个有效节点
    LinkNode* pNext = stack->head.next;
    stack->head.next = pNext->next;
    stack->size--;



};
// 返回栈顶元素
LinkNode* TopLinkStack(LinkStack* stack) {
    if (stack == NULL) {
        return NULL;
    }
    if (stack->size == 0) {
        return NULL;
    }
    // 返回栈顶元素
    return stack->head.next;
};

// 返回栈元素的个数
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);
};

项目主文件代码
main主文件代码

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "LinkedStorage.h"

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


int main(void) {
    // 创建栈
	LinkStack* stack = Init_LinkStack();
    // 创建数据
	Person p1, p2, p3, p4, p5;
	// 将数据传递进入数组
	strcpy(p1.name, "fff");
	strcpy(p2.name, "qqq");
	strcpy(p3.name, "hhh");
	strcpy(p4.name, "ooo");
	strcpy(p4.name, "yyy");
    // 创建年龄类型的数据
	p1.age = 22;
	p2.age = 23;
	p3.age = 24;
	p4.age = 25;
	p5.age = 26;
	//入栈
	Push_LinkStack(stack, (LinkNode*)&p1);
	Push_LinkStack(stack, (LinkNode*)&p2);
	Push_LinkStack(stack, (LinkNode*)&p3);
	Push_LinkStack(stack, (LinkNode*)&p4);
	Push_LinkStack(stack, (LinkNode*)&p5);
	// 输出
	while (Size_LinkStack(stack) > 0) {
	    // 取出栈顶元素
		Person* p = (Person*)TopLinkStack(stack);
		printf("Name = %s Age = %d\n", p->name, p->age);
		// 弹出栈顶元素
		Pop_LinkStack(stack);
	}
	// 销毁栈
	FreeSpace_LinkStack(stack);

	system("pause");
	return 0;

}

项目运行结果展示

相关推荐
星期天27 小时前
3.0 C语⾔内存函数:memcpy memmove memset memcmp 数据在内存中的存储:整数在内存中的存储 ⼤⼩端字节序和字节序判断
c语言·数据结构·进阶·内存函数·数据内存存储
智商低情商凑9 小时前
Go学习之 - Goroutines和channels
开发语言·学习·golang
半桶水专家9 小时前
Go 语言时间处理(time 包)详解
开发语言·后端·golang
编程点滴9 小时前
Go 重试机制终极指南:基于 go-retry 打造可靠容错系统
开发语言·后端·golang
实心儿儿9 小时前
C++ —— 模板进阶
开发语言·c++
萧鼎10 小时前
Python PyTesseract OCR :从基础到项目实战
开发语言·python·ocr
二川bro11 小时前
第57节:Three.js企业级应用架构
开发语言·javascript·架构
sali-tec11 小时前
C# 基于halcon的视觉工作流-章62 点云采样
开发语言·图像处理·人工智能·算法·计算机视觉
fashion 道格11 小时前
用 C 语言玩转归并排序:递归实现的深度解析
数据结构·算法·排序算法
j_xxx404_11 小时前
C++:继承(概念及定义|作用域|基类与派生类转换|默认成员函数|与友元、静态成员关系|多继承|组合)
数据结构·c++