数据结构(C语言版)——顺序栈(代码版)
一、代码
#include <stdio.h>
#include <stdlib.h>#define MAXSIZE 10
#define OK 1
#define ERROR 0;typedef int Status;
typedef struct stackStruct{int data[MAXSIZE];int top;
} Stack;
typedef struct stackStruct* STACK;void PleaseInit(void);
int printMenu(void);
Status initStack(STACK* doublePointers);
Status insertStack(STACK* doublePointers,int SIZE);
Status printElementNumber(const STACK* doublePointers);
Status returnStackTop(const STACK* doublePointers);
Status destroyStack(STACK* doublePointers);
Status stackEmpty(const STACK* doublePointers);
Status clearStack(STACK* doublePointers);
Status pop(STACK* doublePointers);int main(int argc, char *argv[]) {int menuChoice;STACK pointer=NULL;//创建指向该结构类型的指针 while(menuChoice=printMenu()){switch(menuChoice){case 1:initStack(&pointer);break;case 2:destroyStack(&pointer);break;case 3:clearStack(&pointer);break;case 4:stackEmpty(&pointer);break;case 5:returnStackTop(&pointer);break;case 6:insertStack(&pointer,MAXSIZE);break;case 7:pop(&pointer);break;case 8:printElementNumber(&pointer);break;}}return 0;
}//打印菜单
int printMenu(void)
{int choice;printf("****************顺序栈练习******************\n");printf("1:初始化顺序栈\n");printf("2:销毁栈\n");printf("3:清空栈\n");printf("4:栈是否为空\n");printf("5:返回栈顶元素\n");printf("6:插入元素到栈中\n");printf("7:删除栈顶元素,并返回\n"); printf("8:当前栈元素个数\n");printf("按下0退出程序\n"); printf("*******************************************\n");printf("请选择:");scanf("%d",&choice);return choice;
}//1:初始化顺序栈
Status initStack(STACK* doublePointers)
{system("cls");//清屏 printf("当前选的为--1:初始化顺序栈--\n");if((*doublePointers)!=NULL){printf("请勿重复操作\n");return ERROR;}*doublePointers=(STACK)malloc(sizeof(Stack));if((*doublePointers)==NULL){printf("初始化失败\n");return ERROR;}(*doublePointers)->top=0;//top指向栈底 printf("初始化成功!\n");//printf("分配的地址为:%p",*doublePointers); return OK;
}//2:销毁栈
Status destroyStack(STACK* doublePointers)
{system("cls");//清屏 printf("当前选的为--2:销毁栈--\n");char inputChar;if((*doublePointers)==NULL){PleaseInit();return ERROR;}printf("是否销毁栈?(Y/N)");scanf(" %c",&inputChar);if(inputChar=='Y'||inputChar=='y'){//printf("清除的分配地址为:%p",*doublePointers); free((*doublePointers));(*doublePointers)=NULL;printf("销毁成功!\n");}fflush(stdin);return OK;
}//3:清空栈
Status clearStack(STACK* doublePointers)
{system("cls");//清屏 printf("当前选的为--3:清空栈--\n");char inputChar;if((*doublePointers)==NULL){PleaseInit();return ERROR;}if((*doublePointers)->top==0){printf("请先输入一些元素吧\n");return OK;}printf("是否清空栈?(Y/N)");scanf(" %c",&inputChar);if(inputChar=='Y'||inputChar=='y'){(*doublePointers)->top=0;printf("清空成功!\n");}fflush(stdin);return OK;
}//4:栈是否为空
Status stackEmpty(const STACK* doublePointers)
{system("cls");//清屏 printf("当前选的为--4:栈是否为空--\n");if((*doublePointers)==NULL){PleaseInit();return ERROR;}if((*doublePointers)->top==0){printf("当前栈为空栈\n");return OK;}printf("当前栈为不空栈\n");return OK;
}//5:返回栈顶元素
Status returnStackTop(const STACK* doublePointers)
{system("cls");//清屏 printf("当前选的为--5:返回栈顶元素--\n");if((*doublePointers)==NULL){PleaseInit();return ERROR;}if((*doublePointers)->top==0){printf("请先输入一些元素吧\n");return ERROR;}printf("当前栈顶元素为:%d\n",(*doublePointers)->data[(*doublePointers)->top-1]); return OK;
}//6:插入元素到栈中
Status insertStack(STACK* doublePointers,int SIZE)
{system("cls");//清屏 printf("当前选的为--6:插入元素到栈中--\n");if((*doublePointers)==NULL){PleaseInit();return ERROR;}int inputNumber,i,inputValue,leavingsPosition;leavingsPosition=SIZE-((*doublePointers)->top);printf("当前有%d个空闲位置,请输入要插入的元素个数:",leavingsPosition);scanf("%d",&inputNumber);if(inputNumber<1||inputNumber>leavingsPosition){printf("操作失败,超长范围\n");return ERROR;}printf("请输入要插入的元素:");for(i=1;i<=inputNumber;i++){scanf("%d",&inputValue);if((*doublePointers)->top>SIZE){printf("操作失败\n");return ERROR; }(*doublePointers)->data[(*doublePointers)->top]=inputValue;(*doublePointers)->top++;}fflush(stdin);//清除输入缓冲区,防止输入的数值过多 printf("入栈成功!\n");return OK;
}//7:删除栈顶元素,并返回
Status pop(STACK* doublePointers)
{system("cls");//清屏 printf("当前选的为--7:删除栈顶元素,并返回--\n");if((*doublePointers)==NULL){PleaseInit();return ERROR;}if((*doublePointers)->top==0){printf("请先输入一些元素吧\n");return ERROR;}printf("当前栈顶元素为:%d\n",(*doublePointers)->data[((*doublePointers)->top)-1]);(*doublePointers)->top--;printf("删除成功!\n");return OK;
}//8:当前栈元素个数
Status printElementNumber(const STACK* doublePointers)
{system("cls");//清屏 printf("当前选的为--8:当前栈元素个数--\n");if((*doublePointers)==NULL){PleaseInit();return ERROR;}printf("当前栈元素个数为:%d\n",(*doublePointers)->top);return OK;
}
//请先初始化样式
void PleaseInit(void)
{printf("**************\n");printf("*请先初始化 *\n");printf("**************\n\n");
}
二、代码中重要的函数或语句
①:初始化栈
*doublePointers=(STACK)malloc(sizeof(Stack));(*doublePointers)->top=0;
解释:在内存中分配Stack类型的空间,并且*doublePointers指向这个内存地址。
如果分配不成功,malloc返回NULL值。所以在代码中会出现下面的判断
if((*doublePointers)==NULL){printf("初始化失败\n");return ERROR;}
这里需要注意的就是*doublePointers,要养成外面加括号的习惯(优先级问题)。
空间分配成功的话,我们就把top=0,表示top指向栈底。
初始化的最终效果如下图
在初始化中还有下面代码,是用来检查是否重复初始化
if((*doublePointers)!=NULL){printf("请勿重复操作\n");return ERROR;}
②:重要语句1
(一)、
typedef struct stackStruct{int data[MAXSIZE];int top;
} Stack;
typedef struct stackStruct* STACK;
上面定义了一个栈结构,并重新定义名为Stack,并且还定义了一个STACK。
(二)、
STACK pointer=NULL;//创建指向该结构类型的指针
声明一个指向结构的指针变量。因为刚开始没有指向,所以一定要设为NULL。它在以后可以用来判断是否栈是否初始化。
fflush(stdin);
该函数用于清空,输入缓冲区。防止当输入多输入时,对后面的操作有影响。
(三)、
initStack(&pointer);
initStack(STACK* doublePointers)
上面代码就是传递指针参数。效果如下图
③:插入元素到栈中
leavingsPosition=SIZE-((*doublePointers)->top);(*doublePointers)->data[(*doublePointers)->top]=inputValue;//
(*doublePointers)->top++;
leavingsPosition是用来存储剩余空间的变量。
接下来的两个语句一个是把元素压入栈中,另一个是top+1。是栈顶上移
如下图
(原始图)
(元素进栈)
④:删除栈顶元素,并返回
printf("当前栈顶元素为:%d\n",(*doublePointers)->data[((*doublePointers)->top)-1]);(*doublePointers)->top--;
当前第一条语句是把栈顶元素打印,然后top指针下移。
⑤:销毁栈
free((*doublePointers));
(*doublePointers)=NULL;
上面两句代码用下图来说明
(原始图),没执行代码前pointer指针,doublepointer,栈(绿色框代表地址)都在。执行完如下图
(执行后)
三、运行截图
①:初始化栈,并在栈中插入1,2,3,4。4个元素,并显示栈顶元素和当前栈元素个数
②:在上一步的基础上先删除栈顶元素,并返回,在判断栈是否为空,最后清空栈
③:在上一步基础上,判断空栈是否可以初始化,可否判断是否为空栈,可否删除栈顶元素,并返回,可否返回栈顶元素
发现不能初始化
发现可以判断,并给出提示
发现不可以删除栈顶(因为没有元素)
发现不能
④:销毁栈,并随意进行除初始化栈之外的其他操作
重复销毁时给出提示
同样清空栈是也给出提示
如有错误欢迎指出
本篇博客源代码和文件已经上传,欢迎下载
数据结构(C语言版)——顺序栈(代码版)相关推荐
- 数据结构(C语言版)——链栈(代码版)
一.代码 #include <stdio.h> #include <stdlib.h>#define OK 1 #define ERROR 0typedef int Statu ...
- 数据结构(java语言描述)顺序栈的使用
1.声明Istack接口: package stack; public interface Istack { public void clear(); public boolean i ...
- c语言栈的实现以及操作_C++语言实现顺序栈
在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以看看之前的文章,下面是链接C语言实现顺序栈在这 ...
- 顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)
1 #include 2 #include 3 #define STACK_INIT_SIZE 100//储存空间初始分配量 4 #define STACKINCREMENT 10//存储空间分配增量 ...
- 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)
文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...
- 数据结构C++实现(顺序栈) 青岛大学王卓老师
b站 <数据结构与算法基础(青岛大学-王卓)> 所用教材<数据结构C语言版第二版> 中国工信出版集团 人民邮电出版社出版 严蔚敏 编著 #include<iostrea ...
- 实现顺序栈的各种基本运算的算法C语言,实现顺序栈的各种基本运算的算法
试编写一个算法,让两个顺序栈共用一个数组stack[N]试编写一个算法,让两个顺序栈共用一个数组stack[N],分别实现入栈\出栈操要2个栈公用一个存储空间看来栈顶指针只能从两端开始了(和队列有点像 ...
- (数据结构)1.实现顺序栈的各种基本运算 2.实现环形队列的各种基本运算
实验内容 1.编写一个程序,实现顺序栈(假设栈中元素类型ElemType为char)的各种基本运算,并在此基础上完成以下功能. (1)初始化栈s. (2)判断栈s是否为空. (3)依次进栈元素a.b. ...
- C语言实现顺序栈心得
栈的构成及初始化 对于"先进后出"的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量. 栈容量即栈的最大容量,若超过会产生溢出错误.当然,必要时也可以扩充容量. 栈元素可以通过动态 ...
最新文章
- [高级]android应用开发之intent的妙用二
- 工作10年从大公司离职去小公司当CTO,被同事鄙视竟然不回netty
- Android获取系统应用及安装应用的权限列表
- 源码解析 Netty Channel接口及其实现类
- 支持向量机—核函数源码分析(2)
- MySQL查询报错ERROR:No query specified
- python读取只读word只读_人生苦短我学Python——Word处理之快速Word转PDF
- cocos 新工程遇到的问题
- 使用Java和JSF构建一个简单的CRUD应用
- 【WebRTC---入门篇】(十六)端对端1V1传输基本流程
- 交叉熵【度量两个概率分布间的差异性信息】
- Linux 基本命令(八)--touch 常用命令
- 在大于32GB或64GB容量的SD卡上使用NOOB安装树莓派 - Using NOOB on SD cards larger than 32GB or 64GB for Raspberry Pi...
- GoldWave几种转换格式方法
- Assignment中脚注和尾注的正确打开方式
- hdu 1864 最大报销额
- matplotlib科研绘图---Times New Roman字体设置
- 计算机网络密码忘记了怎么办,忘记电脑密码怎么办?--重置电脑密码的方法详解...
- 【zer0pts CTF 2022】 Anti-Fermat
- OAuth2学习(一)——初识OAuth2