【C语言数据结构】栈-链式存储(链栈)

news/2024/11/30 18:53:45/

栈-链式存储-链栈

  • 代码实现


代码实现

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>#define ElemType char//定义链栈结构体,并规定栈顶就是链头,一切操作只能在链头进行
typedef struct LNode {//定义数据,这里一个结构体存储一个数据,所以不需要什么指针啊数组之类的乱七八糟的,就一个变量就够了ElemType data;//定义下一个结点struct LNode *next;
} LNode, *LinkStack;//初始化栈
void InitStack(LinkStack *stack) {//一开始栈里啥也没有,不需要设置头结点*stack = NULL;
}//判断栈空
bool StackEmpty(LinkStack stack) {if (stack == NULL)return true;return false;
}//入栈操作
bool Push(LinkStack *stack, ElemType e) {//因为是链表,所以不用判断是否溢出,基本不可能溢出,直接插入头结点//建立一个新的结构体结点LinkStack new = (LinkStack) malloc(sizeof(LNode));if (new == NULL)//虽然不会溢出,但是内存可能分配失败,还是要顾及一下代码的健壮性的return false;//把数据元素放到结构体里面new->data = e;//让新结构体的下一个指针指向链头new->next = *stack;//把链头移动到新结构体*stack = new;return true;
}//出栈操作
bool Pop(LinkStack *stack, ElemType *e) {//先判断一下栈是否为空if (StackEmpty(*stack))return false;//先将数据元素赋值给E*e = (*stack)->data;//保存一下链头结构体,不然一会儿不好释放内存LinkStack old = *stack;//转移链头到下一个结点位置*stack = (*stack)->next;//释放原来的链头内存空间free(old);return true;
}//获取栈顶元素
bool GetTop(LinkStack stack, ElemType *e) {//先判断栈是否为空if (StackEmpty(stack))return false;//获取栈顶元素*e = stack->data;return true;
}//销毁栈
void DestroyStack(LinkStack *stack) {//不能只销毁链头,要把整个链表全部释放while (*stack != NULL) {LNode *new = *stack;*stack = (*stack)->next;free(new);}
}//-------------------顺便写一道王道课后题代码---------------------
/*P67栈04题;设单链表表头指针为L,结点由data和next两个域构成,其中data域为字符型。
试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称*/bool match(LinkStack stack, int n) { //n是题目中给出的字符的总数int i;//建立一个字符数组,存储前半个链表中的数据元素,用来对比后半个链表中的元素是否相等char data[n / 2];//for循环将前半个链表存储到data字符数组中for (i = 0; i < n / 2; i++) {data[i] = stack->data;stack = stack->next;}i--;//要区分字符总数是奇数个还是偶数个//如果是偶数个字符if(n%2 == 0){for(;i>0;i--){if(data[i] != stack->data)return false;stack = stack->next;}return true;}//如果是奇数个字符else{for(;i>0;i--){if(data[i] != stack->data)return false;stack = stack->next;}}
}//为了方便后面的实验,写一个计算栈长的函数
int Length(LinkStack stack){int num = 0;while(stack != NULL){num++;stack = stack->next;}return num;
}
int main() {//定义链表LinkStack stack;ElemType Elem;//初始化链表InitStack(&stack);
//
//    //插入元素
//    Push(&stack, 1);
//    Push(&stack, 2);
//    Push(&stack, 3);
//
//    //获取栈顶元素
//    GetTop(stack, &Elem);
//    printf("当前栈顶元素为%d\n", Elem);
//
//    //依次出栈元素
//    printf("出栈元素为:");
//    Pop(&stack, &Elem);
//    printf("%d ", Elem);
//    Pop(&stack, &Elem);
//    printf("%d ", Elem);
//    Pop(&stack, &Elem);
//    printf("%d\n", Elem);//将ElemType改为char后,测试题目代码Push(&stack, 'a');Push(&stack, 'b');Push(&stack, 'a');if(match(stack,Length(stack)))printf("该链表为中心对称\n");elseprintf("该链表不是中心对称\n");Push(&stack, 'a');Push(&stack, 'b');Push(&stack, 'a');if(match(stack,Length(stack)))printf("该链表为中心对称\n");elseprintf("该链表不是中心对称\n");Push(&stack, 'a');if(match(stack,Length(stack)))printf("该链表为中心对称\n");elseprintf("该链表不是中心对称\n");//销毁链栈DestroyStack(&stack);return 0;
}

http://www.ppmy.cn/news/1132321.html

相关文章

【租车骑绿道】python实现-附ChatGPT解析

1.题目 租车骑绿道 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车 输入描述 第一行两个数字m、n,自行车限重m,代表部门总…

​为什么流利的英语对于机器学习比数学或编程更重要

​为什么流利的英语对于机器学习比数学或编程更重要 我需要你的帮助&#xff0c;因为我来自多元化的背景&#xff0c;意味着我改变了自己的领域&#xff0c;首先我在学士学位&#xff0c;但后来我转到了和机器学习&#xff0c;这对我来说是新的&#xff0c;但我最终完成了。 …

[管理与领导-107]:IT人看清职场中的隐性规则 - 4 - 职场话术:其实是同一个意思,只是换一种了说法,效果不同,小心被套路

目录 前言&#xff1a; 一、套路和核心思想 1.1 核心思想 1.2 基本原则&#xff1a;让听话者舒服 二、消极变积极的说法 》 自足当下&#xff0c;展望未来 三、委婉拒绝 四、不想接受某项任务 五、正面、让人舒服的表达方式 六、其他 七、职场话术128条&#xff1a;…

黑马程序员RabbitMQ入门到实战教程【基础篇】学习笔记

目录 一、初始MQ 1.1、同步调用 1.2、异步调用 1.3、MQ技术选型 二、RabbitMQ 2.1、安装 2.2、收发消息 2.2.1、交换机 2.2.2、队列 2.2.3、绑定关系 2.2.4、发送消息 2.3、数据隔离 2.3.1、用户管理 2.3.2、virtual host 三、SpringAMQP 3.1、导入Demo工程 3…

1. Flink程序打Jar包

文章目录 步骤注意事项 步骤 用 maven 打 jar 包&#xff0c;需要在 pom.xml 文件中添加打包插件依赖 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><ver…

方法设计时一定要考虑的几点

文章目录 前言方法的基本要求方法名应该见名知意。方法参数不要太多单个方法不要长 关于参数的校验注意返回值为null的情况谨慎使用重载方法 前言 本文主要针对日常在进行代码review过程中发现的一些关于方法设计上的一些常见问题&#xff0c;改进这些问题能够有效的提升方法的…

Java 21 新特性:Unnamed Classes and Instance Main Methods

Java 21引入了两个语言核心功能&#xff1a; 未命名的Java类你说新的启动协议&#xff1a;该协议允许更简单地运行Java类&#xff0c;并且无需太多样板 下面一起来看个例子。通常&#xff0c;我们初学Java的时候&#xff0c;都会写类似下面这样的 Hello World 程序&#xff1…

多线程和并发编程(6)—并发编程的设计模式

优雅终止 如何优雅终止线程&#xff1f; 中断线程的思路是使用两阶段法&#xff1a;第一阶段发生中断请求&#xff0c;第二阶段根据中断标识结束线程&#xff1b; public class Test1 {private volatile static boolean interrupted false;public static void main(String[…