一、代码

#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语言版)——顺序栈(代码版)相关推荐

  1. 数据结构(C语言版)——链栈(代码版)

    一.代码 #include <stdio.h> #include <stdlib.h>#define OK 1 #define ERROR 0typedef int Statu ...

  2. 数据结构(java语言描述)顺序栈的使用

    1.声明Istack接口: package stack; public interface Istack {     public void clear();     public boolean i ...

  3. c语言栈的实现以及操作_C++语言实现顺序栈

    在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以看看之前的文章,下面是链接C语言实现顺序栈在这 ...

  4. 顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)

    1 #include 2 #include 3 #define STACK_INIT_SIZE 100//储存空间初始分配量 4 #define STACKINCREMENT 10//存储空间分配增量 ...

  5. 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)

    文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...

  6. 数据结构C++实现(顺序栈) 青岛大学王卓老师

    b站  <数据结构与算法基础(青岛大学-王卓)> 所用教材<数据结构C语言版第二版> 中国工信出版集团 人民邮电出版社出版 严蔚敏 编著 #include<iostrea ...

  7. 实现顺序栈的各种基本运算的算法C语言,实现顺序栈的各种基本运算的算法

    试编写一个算法,让两个顺序栈共用一个数组stack[N]试编写一个算法,让两个顺序栈共用一个数组stack[N],分别实现入栈\出栈操要2个栈公用一个存储空间看来栈顶指针只能从两端开始了(和队列有点像 ...

  8. (数据结构)1.实现顺序栈的各种基本运算 2.实现环形队列的各种基本运算

    实验内容 1.编写一个程序,实现顺序栈(假设栈中元素类型ElemType为char)的各种基本运算,并在此基础上完成以下功能. (1)初始化栈s. (2)判断栈s是否为空. (3)依次进栈元素a.b. ...

  9. C语言实现顺序栈心得

    栈的构成及初始化 对于"先进后出"的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量. 栈容量即栈的最大容量,若超过会产生溢出错误.当然,必要时也可以扩充容量. 栈元素可以通过动态 ...

最新文章

  1. [高级]android应用开发之intent的妙用二
  2. 工作10年从大公司离职去小公司当CTO,被同事鄙视竟然不回netty
  3. Android获取系统应用及安装应用的权限列表
  4. 源码解析 Netty Channel接口及其实现类
  5. 支持向量机—核函数源码分析(2)
  6. MySQL查询报错ERROR:No query specified
  7. python读取只读word只读_人生苦短我学Python——Word处理之快速Word转PDF
  8. cocos 新工程遇到的问题
  9. 使用Java和JSF构建一个简单的CRUD应用
  10. 【WebRTC---入门篇】(十六)端对端1V1传输基本流程
  11. 交叉熵【度量两个概率分布间的差异性信息】
  12. Linux 基本命令(八)--touch 常用命令
  13. 在大于32GB或64GB容量的SD卡上使用NOOB安装树莓派 - Using NOOB on SD cards larger than 32GB or 64GB for Raspberry Pi...
  14. GoldWave几种转换格式方法
  15. Assignment中脚注和尾注的正确打开方式
  16. hdu 1864 最大报销额
  17. matplotlib科研绘图---Times New Roman字体设置
  18. 计算机网络密码忘记了怎么办,忘记电脑密码怎么办?--重置电脑密码的方法详解...
  19. 【zer0pts CTF 2022】 Anti-Fermat
  20. OAuth2学习(一)——初识OAuth2

热门文章

  1. UNIX环境高级编程源码
  2. 公交线路管理 数据结构课程设计
  3. C#实现汉字转拼音(包括生僻字)
  4. 利用证书签名绕过杀软
  5. 工业大数据应用技术国家工程实验室
  6. attention与self attention的区别
  7. Unity中SetPassCall, Batches的区别,它们与Draw call 的关系
  8. 用token实现单点登录
  9. 【小王的安卓之路】Android原生网络请求
  10. vue2升级到 Vue3的异同(入门须知)