C语言---函数和数组实践:扫雷游戏

函数和数组实践:扫雷游戏

在这次的实践项目中,需要编写一个可以在在控制台运行的经典的扫雷游戏。

一、游戏要求

  • 游戏有菜单,可以通过菜单实现继续玩或者退出游戏
  • 游戏要求棋盘9*9,雷(10个)要求随机布置
  • 可以实现排查雷
    • 如果位置不是雷,就显示周围有几个雷
    • 如果位置是雷就炸死结束游戏
    • 把除了雷之外的所有非雷都找出来,排雷成功,游戏结束

二、游戏设计思路

游戏界面:

①首先对于菜单部分,可以使用基本的printf函数根据自己的想法打印出菜单。

/*初始菜单*/
void menu()
{printf("************************\n");printf("******   1.play   ******\n");printf("******   0.exit   ******\n");printf("************************\n");
}

②其次是关于棋盘的设置

  • 如何制造一个像经典扫雷游戏那样的界面? 可以用一个二维数组存放扫雷游戏需要的布置好的雷的信息。
  • 如何将雷和非雷区分开? 首先可以想到用 ‘*’ 表示雷,用 ‘#’ 表示非雷,这种想法没有问题,但是当描述周围有多少雷的时候并不方便,下面是一个新的思路,可以将雷用字符 ‘1’ 表示,非雷用字符 ’0‘ 表示,这种方式在排雷时就是快速得到周围雷的个数,只需要将周围的8个格子的数字相加就是雷的数量
  • 当雷布置完成开始游戏之后,玩家点击一个格子之后,这个格子显示出来的1,到底是雷,还是表示这个不是雷是周围8个格子中存在一个雷这一信息,如何分辨这两种情况呢? 可以通过建立两个相同大小与类型的二位数组,一个用于布置雷 ’1‘ 和非雷 ’0‘ ,这个是玩家看不到的,另一个用于展示给玩家看的棋盘,存放的是玩家排查雷的信息,这样这两种情况就不会发生冲突。展示给玩家看的那一个二维数组为了保持神秘感,最开始都放 ’ *’ ,这样一开始第一种区分雷和非雷的想法也被否决。
  • 当在排雷的时候,如果排查到边缘的格子会出现下列图示中的情况,并且这个格子不是雷的话,在统计周围8个格子中雷的信息的时候就会发生越界访问的情况,这种问题应该如何解决? 可以将一开始设置的9*9大小的二位数组扩张成11*11大小的二位数组即可,这样遍历的时候就不会发生越界访问的情况。

#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2char mine[ROWS][COLS];		//存放雷的信息
char show[ROWS][COLS];		//存放显示给玩家的信息

文件结构设计

由于游戏规则的实现需要多种函数与逻辑之间的配合,并且锻炼自己的多文件处理和函数的声明和定义的能力,所以这个项目用下面三个文件实现。

test.c //文件中写游戏的测试逻辑
game.c //文件中写游戏中函数的实现等
game.h //文件中写游戏需要的数据类型和函数声明等

具体逻辑的实现

1、菜单选择部分的逻辑实现

​ 按照游戏要求需要实现持续游玩的要求,所以这里需要利用一个循环语句,所以这里的思路是:设置一个变量,用1表示开始游戏,用0表示结束游戏,利用do-while循环,并检测这个变量,正好在输入0时跳出循环并结束游戏。

int main()
{int input = 0;		//用于菜单选择do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}
2、初始化棋盘和显示棋盘中的逻辑实现

​ 由于游戏规则设置需要在显示台进行游戏的显示和操作,所以需要写一个自定义函数填入前面分析的字符,并再写一个自定义函数用于将二维数组显示在控制台。

设计思路:

  • 这里因为前面设置的mine和show数组是同一类型的,所以只需要写一个函数就可以适用于这两个数组,这就是mine数组中雷用字符 ‘1’ 表示,非雷用字符 ’0‘ 表示的原因。

  • 而初始化棋盘和在控制台显示棋盘本质都是对二维数组的遍历。

main.c

void game()
{char mine[ROWS][COLS];		//存放雷的信息char show[ROWS][COLS];		//存放显示给玩家的信息/*初始化棋盘*/InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');/*显示用于展示给玩家的棋盘*/DisplayBoard(show, ROW, COL);
}

game.c

/*
函数:初始化棋盘函数
参数:board:要操作的二维数组棋盘row:棋盘宽度col:棋盘高度set:要填入二维数组棋盘的字符
返回值:无
*/
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{int i = 0;for (i = 0; i < ROWS; i++){int j = 0;for (j = 0; j < COLS; j++){board[i][j] = set;}}
}/*
函数:显示棋盘函数
参数:board:要显示的二维数组棋盘row:显示的棋盘宽度col:显示的棋盘高度
返回值:无
*/
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("--------扫雷游戏--------\n");int i = 0;for (i = 1; i < row; i++){int j = 0;for (j = 1; j < col; j++){printf("%c", board[i][j]);}printf("\n");}
}	

注意:

  • 因为两个二维数组的类型都是char[ROWS][COLS],所以传过去的数组都是11*11,但是在显示棋盘的函数中遍历的时候只需要遍历中间的9*9的区域即可,所以在显示棋盘的函数中的for循环都将i,j都控制在了1~9的范围内。而初始化棋盘则无所谓为了方便直接全部遍历即可。
  • 其中为了后续排雷部分的坐标输入方便,这里需要在显示棋盘部分的周围列出行号和列号。在一开始就把列号打印出来,然后可以在每一行打印之前,先打印行号即可实现打印出行号和列号的目的。

运行结果:

3、布置雷的逻辑实现

对于布置雷实际上还是把雷放在了中间9*9的这块区域中去,而且这是属于雷的信息只需要对mine数组进行操作即可,但是这一部分最重要的还是如何实现**“随机”放雷**这一要求。

  • 第一点:直接操作mine数组中的9*9这一块区域即可
  • 第二点:利用rand函数,实现随机放雷这一要求

设计思路:

  • 定义变量COUNT规定放置的雷的数量,并循环放置直到雷的数量与COUNT的大小一样
  • 利用rand函数,结合公式**(随机生成a~b的数:a+rand( )%b-a+1)**
    • 注意使用rand函数之前需要添加头文件<stdlib.h> <time.h>
    • 并在main函数中加上语句srand((unsigned int)time(NULL));
  • 定义变量X Y分别作为雷的横坐标和纵坐标,对利用rand函数随机生成X Y
  • 要对生成的雷的坐标利用if语句进行检测,看是否已经放过雷
  • 其中对于生成雷的区域也是在中间的9*9这一区域,所以在调用放置函数是参数要写ROW和COL

game.c

/*
函数:布置雷函数(随机布置10个)
参数:board:要布置雷的二维数组棋盘row:布置雷的棋盘宽度col:布置雷的棋盘高度
返回值:无
*/
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = COUNT;		//定义雷的数量while (count)			//循环放雷{int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0')	//判断是否已经放过雷{board[x][y] = '1';count--;}}
}

main.c

int main()
{/*以时间为基准生成用于产生随机数的种子*/srand((unsigned int)time(NULL));
}
4、排查雷的逻辑实现(第一版)

排查雷是在mine数组中查找,然后将查找的数据放在show数组中显示给玩家。

设计思路:

  • 首先编写一个自定义的排查雷函数,将mine和show两数组传过去用于对比
  • 在定义变量x y用于接收玩家选择的扫雷坐标,在定义一个变量win用于记录已经排查过的雷的数量
    • 用win表示已经排查出的雷,并将其作为跳出排查循环的参数
    • 对于接收坐标(x , y)需要加入if判断语句检测是否越界
    • 总结:在外界接收的信息都应该进行判断再使用,防止产生越界造成错误
  • 判断玩家输入的坐标是否是雷,并返回相应结果
    • 输入坐标是雷,结束游戏,显示mine数组展示答案
    • 输入坐标不是雷,显示周围的雷的个数并将该数据展示在show数组中,继续游戏
  • 最后结束游戏,展示最终答案,显示mine数组

game.c

/*
函数:计算周围雷个数函数
参数:mine:要布置雷的二维数组棋盘x:玩家输入的横坐标y:玩家输入的纵坐标
返回值:无
*/
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}/*
函数:排查雷函数
参数:mine:包含雷的信息的二维数组棋盘show:展示给玩家的二维数组棋盘row:排查雷的棋盘宽度col:排查雷的棋盘高度
返回值:无
*/
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - COUNT){printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x < row && y >= 1 && y < col)	//检测坐标是否合法{if (mine[x][y] == '1')	//排到雷,游戏结束{printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;		//直接跳出while循环,结束游戏}else       //未排到雷,显示周围雷的个数{int count = GetMineCount(mine, x, y);show[x][y] = count + '0';	//显示周围的雷的个数DisplayBoard(show, ROW, COL);win++;	//排雷数加1}}else{printf("输入坐标有误,请重新输入\n");  //坐标非法,此时win还不满足跳出循环条件故,重新回到while循环中}}if (win == ROW * COL - COUNT)		//找到除了雷的所有位置,排雷成功{printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

注意:

  • 上述代码中对数字和字符的转化十分灵活。字符‘0’的ASCLL码值是48,数字0的ASCLL码值是0,当数字0加上‘0’的时候,得到的结果就是字符数字‘0’。上述代码通过这种转化将显示出来的字符和实际的数字建立了紧密的联系,这种思想十分重要。

三、最终代码汇总

game.h

#pragma once/*头文件*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>/*宏定义*/
#define COUNT 10		//雷的数量#define ROW 9			//棋盘宽度
#define COL 9			//棋盘高度#define ROWS ROW+2
#define COLS COL+2/*函数声明*/
/*初始化棋盘函数*/
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);/*显示棋盘函数*/
void DisplayBoard(char board[ROWS][COLS], int row, int col);/*随机布置雷*/
void SetMine(char board[ROWS][COLS], int row, int col);/*计算周围雷的个数*/
int GetMineCount(char mine[ROWS][COLS], int x, int y);/*排雷函数*/
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS#include "game.h"/*
函数:初始化棋盘函数
参数:board:要操作的二维数组棋盘row:棋盘宽度col:棋盘高度set:要填入二维数组棋盘的字符
返回值:无
*/
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{int i = 0;for (i = 0; i < ROWS; i++){int j = 0;for (j = 0; j < COLS; j++){board[i][j] = set;}}
}/*
函数:显示棋盘函数
参数:board:要显示的二维数组棋盘row:显示的棋盘宽度col:显示的棋盘高度
返回值:无
*/
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("-----扫雷游戏-----\n");int i = 0;for (i = 0; i < col; i++){printf("%d ", i);	//打印行号}printf("\n");		//换行开始打印列号和棋盘for (i = 1; i < row; i++){printf("%d ", i);//打印列号int j = 0;for (j = 1; j < col; j++){printf("%c ", board[i][j]);}printf("\n");}
}	/*
函数:布置雷函数(随机布置10个)
参数:board:要布置雷的二维数组棋盘row:布置雷的棋盘宽度col:布置雷的棋盘高度
返回值:无
*/
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = COUNT;		//定义雷的数量while (count)			//循环放雷{int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0')	//判断是否已经放过雷{board[x][y] = '1';count--;}}
}/*
函数:计算周围雷个数函数
参数:mine:要布置雷的二维数组棋盘x:玩家输入的横坐标y:玩家输入的纵坐标
返回值:无
*/
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y]+ mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}/*
函数:排查雷函数
参数:mine:包含雷的信息的二维数组棋盘show:展示给玩家的二维数组棋盘row:排查雷的棋盘宽度col:排查雷的棋盘高度
返回值:无
*/
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - COUNT){printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x < row && y >= 1 && y < col)	//检测坐标是否合法{if (mine[x][y] == '1')	//排到雷,游戏结束{printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;		//直接跳出while循环,结束游戏}else       //未排到雷,显示周围雷的个数{int count = GetMineCount(mine, x, y);show[x][y] = count + '0';	//显示周围的雷的个数DisplayBoard(show, ROW, COL);win++;	//排雷数加1}}else{printf("输入坐标有误,请重新输入\n");  //坐标非法,此时win还不满足跳出循环条件故,重新回到while循环中}}if (win == ROW * COL - COUNT)		//找到除了雷的所有位置,排雷成功{printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

main.c

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include "game.h"/*初始菜单*/
void menu()
{printf("************************\n");printf("******   1.play   ******\n");printf("******   0.exit   ******\n");printf("************************\n");
}/*游戏流程*/
void game()
{char mine[ROWS][COLS];		//存放雷的信息char show[ROWS][COLS];		//存放显示给玩家的信息/*初始化棋盘*/InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');/*显示用于展示给玩家的棋盘*/DisplayBoard(show, ROW, COL);/*随机布置雷*/SetMine(mine, ROW, COL);/*排雷*/FindMine(mine, show, ROW, COL);
}/*主函数流程*/
int main()
{int input = 0;		//用于菜单选择/*以时间为基准生成用于产生随机数的种子*/srand((unsigned int)time(NULL));	do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

我的Gitee链接如下:[扫雷游戏](扫雷游戏/扫雷游戏 · Tanecious./C语言练习代码 - 码云 - 开源中国)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

二叉搜索树中的插入操作 https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树返回插入后二叉搜索树的根节点。 输入数据 保…

数据集-目标检测系列- 石榴 检测数据集 pomegranate >> DataBall

数据集-目标检测系列- 石榴 检测数据集 pomegranate >> DataBall DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(fre…

项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试

前言 在嵌入式设备的OTA场景测试和其他断电上电测试过程中&#xff0c;有的场景发生在夜晚或者随时可能发生&#xff0c;这个时候不可能24h人工盯着&#xff0c;需要自动化抓取串口日志处罚断电上电操作。 下面的python脚本可以实现自动抓取串口指定关键词&#xff0c;然后触发…

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

DICOM医学影像中的定位线(Localization Line) 在医学影像学中,DICOM是用于存储和交换医学影像的标准格式。定位线(Localization Line)在医学影像的显示和分析中起着重要作用,它帮助医生和医学专业人员在影像中精确地标定重要的解剖结构、区域或特征,辅助进行定位、治疗计…

《自动驾驶与机器人中的SLAM技术》ch8:基于 IESKF 的紧耦合 LIO 系统

目录 基于 IESKF 的紧耦合 LIO 系统 1 IESKF 的状态变量和运动过程 1.1 对名义状态变量的预测 1.2 对误差状态变量的预测及对协方差矩阵的递推 2 观测方程中的迭代过程 3 高维观测中的等效处理 4 NDT 和 卡尔曼滤波的联系 5 紧耦合 LIO 系统的主要流程 5.1 IMU 静止初始化 …

HTML实战课堂之简单的拜年程序

一、目录&#xff1a; &#xfffc;&#xfffc; 一、目录&#xff1a; 二、祝福 三&#xff1a;代码讲解 &#xff08;1&#xff09;详细解释&#xff1a; 1.HTML部分 2. CSS部分 三、运行效果&#xff08;随机截图&#xff09;&#xff1a; 四、完整代码&#xff1a; 二、祝福…

vue 与 vue-json-viewer 实现 JSON 数据可视化

前言 接口的调试和测试是确保系统稳定性的重要步骤。为了让开发人员和测试人员能够直观地查看接口返回的 JSON 数据&#xff0c;使用合适的工具至关重要。vue-json-viewer 插件为 vue 开发者提供了一个简单而强大的解决方案。本文将详细介绍如何在 vue 项目中使用该插件&#x…

用Pygame Zero 画矩形(空心、实心、多个矩形、多层同心矩形、彩虹条矩形、条纹相间、随机颜色矩形、特殊效果、渐变效果)

用Pygame Zero 画矩形 &#xff08;空心、实心、多个矩形、多层同心矩形、彩虹条矩形、条纹相间、随机颜色矩形、特殊效果、渐变效果&#xff09; 本文目录&#xff1a; 零、时光宝盒 一、绘制空心矩形 二、绘制实心矩形 三、画多个静止矩形 四、绘制多层同心矩形 4.1、…

【Rust自学】11.9. 单元测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.9.1. 测试的分类 Rust把测试分为两类&#xff0c;一个是单元测试&#xff0c;一个是集成测试。 单元测试比较小也比较专注&#xff…

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue 优先级队列表示为平衡二进制堆&#xff1a; queue[n] 的两个子级是 queue[2*n1] 和 queue[2*&#xff08;n1&#xff09;]。 注&#xff1a;左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…

回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测

回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测 目录 回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 RVM-Adaboost相关向量机集成学习多输入单输出回归预测是一种先进…

Linux(Centos7)安装Mysql/Redis/MinIO

安装Mysql 安装Redis 搜索Redis最先版本所在的在线安装yum库 查看以上两个组件是否是开机自启 安装MinIO 开源的对象存储服务&#xff0c;存储非结构化数据&#xff0c;兼容亚马逊S3协议。 minio --help #查询命令帮助minio --server --help #查询--server帮助minio serve…

MySQL批量修改数据表编码及字符集为utf8mb4

​​​​​​MySQL批量修改数据表编码及字符集为utf8mb4 utf8mb4编码是utf8编码的超集&#xff0c;兼容utf8&#xff0c;并且能存储4字节的表情字符。 采用utf8mb4编码的好处是&#xff1a;存储与获取数据的时候&#xff0c;不用再考虑表情字符的编码与解码问题。 更改数据库…

Edge浏览器网页设置深色模式/暗模式

文章目录 需求分析1. 浏览器中的设置——外观——深色。2. 在Edge浏览器的地址栏如下网址&#xff1a;edge://flags/&#xff0c;直接搜索Dark则有内容弹出&#xff0c;将Default更改为Enable即可设置成功。3. 成果 需求 长期对着电脑屏幕&#xff0c;白色实在太刺眼&#xff…

TypeScript Jest 单元测试 搭建

NPM TypeScript 项目搭建 创建目录 mkdir mockprojectcd mockproject初始化NPM项目 npm init -y安装TypeScript npm i -D typescript使用VSCode 打开项目 创建TS配置文件tsconfig.json {"compilerOptions": {"target": "es5","module&…

基于FPGA的多功能数字钟设计

基于FPGA的多功能数字钟设计 前言基础知识按键数码管 系统概述按键使用说明模块描述模块设计button_debouncebutton_controllerclock_controllerdigital_tube 整体资源用量测试视频 前言 本工程主要是数码管、按键、LED的应用开发。 注&#xff1a;本工程所有IP均使用源码开发…

利用开源AI智能名片2+1链动模式S2B2C商城小程序拓展社交电商的深度实践探索

摘要&#xff1a;在数字化浪潮席卷全球的今天&#xff0c;社交电商作为一种新兴的商业模式&#xff0c;正以前所未有的速度改变着消费者的购物习惯与商家的营销策略。本文深入探讨了开源AI智能名片21链动模式S2B2C商城小程序在社交电商领域的应用&#xff0c;通过分析其核心机制…

【优选算法篇】:模拟算法的力量--解决复杂问题的新视角

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.模拟算法二.例题1.替换所有的问号2.提莫攻击3.外观数列4…

2_CSS3 背景 --[CSS3 进阶之路]

CSS3 中的背景属性提供了许多强大的功能来增强网页设计&#xff0c;包括但不限于多背景图像、渐变、背景大小控制等。以下是一些关键的 CSS3 背景属性及其用法示例。 1. 多重背景图像 CSS3 允许你为一个元素设置多个背景图像。这些图像按照它们在 background-image 属性中定义…

蓝桥杯备考:数据结构之栈 和 stack

目录 栈的概念以及栈的实现 STL 的stack 栈和stack的算法题 栈的模板题 栈的算法题之有效的括号 验证栈序列 后缀表达式 括号匹配 栈的概念以及栈的实现 栈是一种只允许在一端进行插入和删除的线性表 空栈&#xff1a;没有任何元素 入栈&#xff1a;插入元素消息 出…