当前位置: 首页 > news >正文

数据结构(c语言版) 栈

顺序栈

要求:实现顺序栈的入栈,出栈,显示栈

代码

#include <stdio.h>
#define MAXSIZE 100struct liststack{int data[MAXSIZE];int top;
};//初始化栈
void init(struct liststack * LS){LS->top = -1;
}//入栈操作
void instack(struct liststack * LS, int value){//判断是否栈满if(LS->top == (MAXSIZE-1)){printf("入栈失败:栈满!\n");return;}//入栈LS->top ++;LS->data[LS->top] = value;printf("数据 %d 入栈成功,在第 %d 位\n", value, LS->top+1);
}//出栈操作
void outstack(struct liststack * LS){//判断是否栈空if(LS->top == -1){printf("出栈失败:栈空!\n");return;}//出栈printf("第 %d 位数据为 %d 出栈成功!\n",LS->top+1 , LS->data[LS->top]);LS->top --;
}//显示栈的数据
void isstack(struct liststack * LS){//判断是否栈空if(LS->top == -1){printf("显示栈失败:栈空!\n");return;}int index = LS->top;while(index != -1){printf("第 %d 位数据是 %d \n",index + 1, LS->data[index]);index --;}
}//判断栈
int emptystack(struct liststack * LS){if(LS->top == -1){printf("栈为空栈\n");return 1;}if(LS->top == (MAXSIZE-1)){printf("栈为满栈\n");return 0;}printf("既不是空栈,也不是满栈\n");return 2;}int main(){struct liststack LS;init(&LS);printf("****************入栈操作****************\n");int value;printf("请输入入栈的数据(输入0则结束):");scanf("%d", &value);while (value != 0){instack(&LS, value);printf("请输入入栈的数据(输入0则结束):");scanf("%d", &value);}printf("\n****************显示栈中数据****************\n");isstack(&LS);printf("\n****************出栈操作****************\n");int flag;printf("出栈请输入1,结束请输入0:");scanf("%d", &flag);while (1){if(flag == 1){outstack(&LS);}if(flag == 0){break;}printf("出栈请输入1,结束请输入0:");scanf("%d", &flag);}printf("\n****************显示栈中数据****************\n");isstack(&LS);printf("\n****************判断栈****************\n");emptystack(&LS);
}

运行结果

****************入栈操作****************
请输入入栈的数据(输入0则结束):10
数据 10 入栈成功,在第 1 位
请输入入栈的数据(输入0则结束):20
数据 20 入栈成功,在第 2 位
请输入入栈的数据(输入0则结束):304
数据 304 入栈成功,在第 3 位
请输入入栈的数据(输入0则结束):450
数据 450 入栈成功,在第 4 位
请输入入栈的数据(输入0则结束):596
数据 596 入栈成功,在第 5 位
请输入入栈的数据(输入0则结束):0****************显示栈中数据****************5 位数据是 5964 位数据是 4503 位数据是 3042 位数据是 201 位数据是 10****************出栈操作****************
出栈请输入1,结束请输入015 位数据为 596 出栈成功!
出栈请输入1,结束请输入014 位数据为 450 出栈成功!
出栈请输入1,结束请输入00****************显示栈中数据****************3 位数据是 3042 位数据是 201 位数据是 10****************判断栈****************
既不是空栈,也不是满栈进程已结束,退出代码为 0

链栈

实现链栈的创建,入栈,出栈,显示栈

代码

#include <stdio.h>
#include <malloc.h>struct linkstack{int data;struct linkstack * next;
};//初始化栈
void init(struct linkstack * LS){LS->next = NULL;
}//判断栈
int emptystack(struct linkstack * LS){if(LS->next == NULL){printf("栈为空栈\n");return 0;}printf("栈不是空栈\n");return 1;
}//入栈  头插法
void instack(struct linkstack * LS, int value){if(LS == NULL){printf("栈不存在\n");return;}struct linkstack * NewNode = malloc(sizeof(struct linkstack));if(NewNode){NewNode->data = value;NewNode->next = LS->next;LS->next = NewNode;printf("数据 %d 入栈成功!\n", value);} else{printf("入栈失败!\n");}};//出栈
void outstack(struct linkstack * LS){if(LS->next == NULL){printf("出栈失败:栈为空!\n");}struct linkstack* temp = LS->next;LS->next = LS->next->next;printf("数据 %d 出栈成功!\n",temp->data);free(temp);
}//显示栈
void isstack(struct linkstack * LS){if(LS->next == NULL){printf("显示栈失败:栈为空!\n");}int top = 1;struct linkstack* temp = LS->next;while(temp != NULL){printf("距栈顶第 %d 位的数据是 %d \n",top, temp->data);top ++;temp = temp->next;}
}int main(){struct linkstack LS;init(&LS);printf("****************链栈入栈操作****************\n");int value;printf("请输入入栈的数据(输入0则结束):");scanf("%d", &value);while (value != 0){instack(&LS, value);printf("请输入入栈的数据(输入0则结束):");scanf("%d", &value);}printf("\n****************显示链栈中数据****************\n");isstack(&LS);printf("\n****************链栈出栈操作****************\n");int flag;printf("出栈请输入1,结束请输入0:");scanf("%d", &flag);while (1){if(flag == 1){outstack(&LS);}if(flag == 0){break;}printf("出栈请输入1,结束请输入0:");scanf("%d", &flag);}printf("\n****************显示链栈中数据****************\n");isstack(&LS);printf("\n****************判断链栈****************\n");emptystack(&LS);
}

运行结果

在这里插入图片描述

共享栈

要求:两栈共享技术

代码

#include <stdio.h>
#define MAXSIZE 100//声明结构体
struct DListStack{int data[MAXSIZE];int top[2];
};//初始化结构体
void init(struct DListStack* DLS){DLS->top[0] = -1;DLS->top[1] = MAXSIZE;
}//入栈
void inDLStack(struct DListStack* DLS, int value, int i){//判断是否满栈if(DLS->top[0]+1 == DLS->top[1]){printf("入栈失败:栈满\n");return;}//判断在第几个栈 入栈if(i == 0){DLS->top[0]++;DLS->data[DLS->top[0]] = value;printf("数据 %d 在共享栈的第左栈中第 %d 位入栈成功\n",value, DLS->top[0]+1);return;}if(i == 1){DLS->top[1]--;DLS->data[DLS->top[1]] = value;printf("数据 %d 在共享栈的右栈中第 %d 位入栈成功\n",value, DLS->top[1]+1);return;}printf("入栈失败\n");
}//出栈
void outDLStack(struct DListStack* DLS, int i){//判断是否满栈if(DLS->top[0] == -1 && DLS->top[1] == MAXSIZE){printf("出栈失败:两个栈都为空栈\n");return;}//判断在第几个栈 出栈if(i == 0){if(DLS->top[0] == -1){printf("出栈失败:左栈为空栈!\n");return;}printf("数据 %d 在共享栈的左栈中第 %d 位出栈成功\n",DLS->data[DLS->top[0]], DLS->top[0]+1);DLS->top[0]--;return;}if(i == 1){if(DLS->top[1] == -1){printf("出栈失败:右栈为空栈!\n");return;}printf("数据 %d 在共享栈的右栈中第 %d 位出栈成功\n",DLS->data[DLS->top[1]], DLS->top[1]+1);DLS->top[1]++;return;}printf("出栈失败\n");
}//显示栈
void isDLStack(struct DListStack* DLS){//判断是否满栈if(DLS->top[0] == -1 && DLS->top[1] == MAXSIZE){printf("显示栈失败:两个栈都为空栈\n");return;}//显示第一个栈int index_0 = DLS->top[0];if(index_0 == -1){printf("显示栈失败:左栈为空栈!\n");}while (index_0 != -1){printf("数据 %d 在共享栈的左栈中第 %d 位出栈成功\n",DLS->data[index_0], index_0+1);index_0 --;}//显示第er个栈int index_1 = DLS->top[1];if(index_1 == MAXSIZE){printf("显示栈失败:右栈为空栈!\n");}while (index_1 != MAXSIZE){printf("数据 %d 在共享栈的右栈中第 %d 位出栈成功\n",DLS->data[index_1], index_1+1);index_1 ++;}}int main(){struct DListStack DLS;init(&DLS);printf("********************入栈操作***********************\n");int value,index;printf("请输入入栈的值和左(0)栈或者右(1)栈,输入2 2则结束:");scanf("%d %d",&value, &index);while (1){if(index == 0){inDLStack(&DLS, value, 0);}if(index == 1){inDLStack(&DLS, value, 1);}if(index == 2){break;}printf("请输入入栈的值和左(0)栈或者右(1)栈,输入2 2则结束:");scanf("%d %d",&value, &index);}printf("\n********************显示栈操作***********************\n");isDLStack(&DLS);printf("\n********************出栈操作***********************\n");int flag;printf("出左栈则输入0,出右栈则输入1,结束则输入2:");scanf("%d", &flag);while (1){if(flag == 0){outDLStack(&DLS, 0);}if(flag == 1){outDLStack(&DLS, 1);}if(flag == 2){break;}printf("出左栈则输入0,出右栈则输入1,结束则输入2:");scanf("%d", &flag);}printf("\n********************显示栈操作***********************\n");isDLStack(&DLS);}

运行结果

在这里插入图片描述

相关文章:

  • 互联网系统安全(一)
  • 小程序员 scroll滚动与页面滚动冲突造成快速滑到底部卡顿失败问题
  • 蓝桥杯官网填空题(激光样式)
  • C#解析XML并反序列化为Model的方法
  • ubuntu20.04 安装cudnn
  • 单链表(3)
  • 成绩公布方式,这样操作更方便
  • 十三、W5100S/W5500+RP2040树莓派Pico<FTP Server>
  • ActiveMq学习⑨__基于zookeeper和LevelDB搭建ActiveMQ集群
  • 论文阅读:Ensemble Knowledge Transfer for Semantic Segmentation
  • 阿里云99元服务器2核2G3M带宽_4年396元_新老用户均可
  • VScode + opencv + c++ + win配置教程
  • 初识微服务技术栈
  • iOS 让界面元素的文字随着语言的更改而变化——本地化文字跟随
  • 如何在 Unbuntu 下安装配置 Apache Zookeeper
  • Angular数据绑定机制
  • CentOS7 安装JDK
  • Docker下部署自己的LNMP工作环境
  • Git同步原始仓库到Fork仓库中
  • linux学习笔记
  • Odoo domain写法及运用
  • Webpack 4 学习01(基础配置)
  • webpack4 一点通
  • 浮现式设计
  • 你不可错过的前端面试题(一)
  • 算法-插入排序
  • 在electron中实现跨域请求,无需更改服务器端设置
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #if和#ifdef区别
  • #LLM入门|Prompt#3.3_存储_Memory
  • (6)设计一个TimeMap
  • (c语言)strcpy函数用法
  • (zhuan) 一些RL的文献(及笔记)
  • (十六)串口UART
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • *2 echo、printf、mkdir命令的应用
  • .net MySql
  • .NET 反射 Reflect
  • .netcore 获取appsettings
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net分布式压力测试工具(Beetle.DT)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET微信公众号开发-2.0创建自定义菜单
  • ??eclipse的安装配置问题!??
  • @RequestBody与@ModelAttribute
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • []sim300 GPRS数据收发程序
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [BZOJ1053][HAOI2007]反素数ant
  • [C# 开发技巧]实现属于自己的截图工具
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [CISCN 2019华东南]Web11
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件
  • [javaee基础] 常见的javaweb笔试选择题含答案