当前位置: 首页 > 编程日记 > 正文

数据结构之【栈】的基本操作C语言实现

引题:
       很多人都把【栈】描述成【弹匣】,但我总感觉有点不恰当,因为弹匣从上端【装弹】之后,子弹总是在匣的上层;而元素【进栈】之后,总在栈的下面。
       我觉得还是描述成【从下往上向书箱里一层一层地装书,从上往下一层一层地拿书】比较合适。
       不过,描述成某东西或某行为无非是帮助我们更好地去理解【栈】,具体描述成什么样都无所谓,有助于我们理解就行!

在这里插入图片描述
下面我们直入主题:


在这里插入图片描述


顺序栈的声明:
0、顺序栈的声明
顺序栈的基本操作:
1、InitStack(&S)(初始化栈)
2、DestroyStack(&S)(销毁栈)
3、ClearStack(&S)(清空栈)
4、StackEmpty(S)(判断栈是否为空)
5、StackLength(S)(返回栈的长度)
6、GetTop(S,&e)(返回栈的栈顶元素)
7、Push(&S,e)(将元素e压入栈)
8、Pop(&S,&e)(栈顶元素出栈)
9、StackTraverse(S,Status(*visit)())(遍历栈)
顺序栈的应用:
10、CharMatch(检查符号{【()】}是否匹配)


顺序栈

------- 栈的顺序存储表示 -------回顶部

//关键字宏定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define STACK_INIT_SIZE 100//顺序栈存储空间的初始分配量
#define STACKINCREMENT 10//顺序栈存储空间的分配增量
//关键字的类型说明
typedef int SElemType;
typedef int Status;
//数据元素(顺序栈)的类型说明
typedef struct{SElemType *base;  //栈底指针 SElemType *top;   //栈顶指针 int stacksize;    //当前已分配的存储空间 
}SqStack;

------- 顺序栈的基本操作 -------

1、InitStack(&S)(初始化栈) ----回顶部

//先分配空间,并指向栈底指针,然后栈顶指针和栈底指针相等 
Status InitStack(SqStack &S){    // 构造一个空栈 S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));if(!S.base)exit(0);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
}

2、DestroyStack(&S)(销毁栈) ----回顶部

//释放分配的存储空间,释放指针,将存储空间的长度置为0 
Status DestroyStack(SqStack &S){    //销毁栈S,S不再存在 free(S.base);S.base = NULL;S.top = NULL;S.stacksize = 0;printf("销毁成功");return OK; 
}

3、ClearStack(&S)(清空栈) ----回顶部

//判断栈顶指针与栈底指针是否相等,然后逐步释放空间,并逐渐将栈顶指针-1,直至两者相等 
Status ClearStack(SqStack &S){  //把S置为空栈 if(S.top == S.base){printf("本身就是空栈");return OK;}while(S.top != S.base){S.top--;*S.top = NULL;}if(S.top == S.base){S.base = NULL;S.top = NULL;printf("\n栈已被清空\n");return OK;}return ERROR;
}

4、StackEmpty(S)(判断栈是否为空) ----回顶部

//判断栈顶指针和栈底指针是否相等,相等则为空栈,否则非空 
Status StackEmpty(SqStack S){  //若栈S为空栈,则返回TRUE,否则返回FALSE if(S.top == S.base){return TRUE;}return FALSE;
}

5、StackLength(S)(返回栈的长度) ----回顶部

//栈顶指针-栈底指针的差即为栈的长度 
int StackLength(SqStack S){   //返回S的元素个数,即栈的长度 return (S.top - S.base); 
}

6、GetTop(S,&e)(返回栈的栈顶元素) ----回顶部

//返回栈顶的元素(栈顶指针-1所指向的元素) 
Status GetTop(SqStack S, SElemType &e){//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if(S.top == S.base){printf("空栈,无法返回栈顶元素");return ERROR;}	e = *(S.top-1);return OK;
}

7、Push(&S,e)(将元素e压入栈) ----回顶部

//先判断栈是否已满,(若栈满,则再分配空间),然后将元素插入栈顶,并另栈顶指针+1 
Status Push(SqStack &S,SElemType e){ //插入元素e为新的栈顶元素if((S.top - S.base) >= S.stacksize){S.base = (SElemType*) realloc (S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(0);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;
}

8、Pop(&S,&e)(栈顶元素出栈) ----回顶部

//先判断栈是否已空,(若空,则返回ERROR),若不空将栈顶指针-1 
Status Pop(SqStack &S,SElemType &e){    //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top == S.base)return ERROR;e = * --S.top;return OK;
}

9、StackTraverse(S,Status(*visit)())(遍历栈) ----回顶部

Status visit(int *p){if(p){printf("%d ",*p);return OK;}return ERROR;
}
//从栈底指针所指向的元素开始,依次访问,直至遇到栈顶指针 
Status StackTraverse(SqStack S,Status(*visit)(int*)){//从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败 SElemType *p;p = S.base;while(p<S.top){visit(p);p++;}if(p == S.top){return OK;}return ERROR;
}

------- 顺序栈的应用 -------

10、检查符号是否匹配 ----回顶部

Status CharMatch(char a[]){ //检查符号匹配// 91:[     93:]// 40:(     41:)// 123:{    125:} SqStack S;InitStack(S);SElemType e;int i;for(i=0; a[i]!='\0'; i++){switch (a[i]){case '{':case '[':case '(':Push(S,a[i]);break;case ')':case ']':case '}':if(StackEmpty(S)){printf("符号不匹配"); //情况①遇到右括号,栈空,则不匹配 return ERROR;}else{GetTop(S,e);if(((e+2)==a[i]) || ((e+1)==a[i])){ //如果匹配,则将栈顶元素(即对应左括号)出栈 Pop(S,e);}else{printf("符号不匹配");  //情况②遇到的右括号与栈顶元素不匹配,则符号不匹配 return ERROR;}}break;}}if(StackEmpty(S)){printf("符号匹配");return OK;}printf("符号不匹配");  //情况③如果只有左括号,没有右括号 return ERROR; }//CharMatch

参考文献:
[1] 严蔚敏,吴伟民 ,《数据结构(C语言版)》.
[2] 程杰,《大话数据结构》,清华大学出版社,2011出版年.
[2] 明日科技,《C语言 从入门到精通》,清华大学出版社,2019年版

相关文章:

编码小记(未整理-持续更新)

----------------基本概念-------------------------------一.位&#xff1a; 计算机存储信息的最小单位&#xff0c;称之为位&#xff08;bit&#xff09;&#xff0c;音译比特&#xff0c;二进制的一个“0”或一个“1”叫一位。 二.字节 字节&#xff08;Byte&#xff09;是一…

使用locate 的正则查询 查找所有main.c

locate支持正则查询的功能&#xff0c; 只需输入locate -r 正则表达式 即可。 现在我想查找所有main.c怎么做&#xff1f; 打开终端&#xff0c;输入shell&#xff1a; locate -r main.c$ PS&#xff1a;$表示结束字符串结束。转载于:https://www.cnblogs.com/the-one/p…

My Favorites

AJAX "Atlas" Control Toolkit HomePage "Atlas" Client Class Library "Atlas" Server Class Library ASP.NET AJAX Roadmap http://www.ajaxian.com 被成为AJAX第一站 . http://www.ajaxmatters.com/ 不仅有讨论XMLHttpRequest 的文…

数据库事务初探

使用事务级别要慎重: 因为事务级别越高&#xff0c;数量越多、限制性更强的锁就会被运用到数据库记录或者表中。同时&#xff0c;更多的锁被运用到数据库和它们的覆盖面越宽&#xff0c;任意两个事务冲突的可能性就越大。 如果有一个冲突&#xff08;例如两个事务试图获取同一个…

数据结构之【队列】的基本操作C语言实现

直接上图&#xff1a; 循环队列的声明&#xff1a; 0、循环队列的声明 循环队列的基本操作&#xff1a; 1、InitQueue(&Q)&#xff08;构造一个空队列&#xff09; 2、DestroyQueue(&Q)&#xff08;销毁队列Q&#xff09; 3、ClearQueue(&Q)&#xff08;清空队列Q&…

在python3环境安装builtwith模块

1、安装命令&#xff1a; pip install builtwith 如果在命令行提示如下错误&#xff1a; Fatal error in launcher: Unable to create process using " 使用如下命令&#xff1a; python3 -m pip install builtwith 2、导入模块会出现错误提示&#xff1a; 原因&#xff1…

kettle组件-输出

1&#xff1a;删除连接数据库&#xff1a;新建连接数据库&#xff0c;或者应用转换中已经定义好的数据库。目标模式&#xff1a;指什么现在还不明确&#xff0c;集群模式&#xff1f;子服务器模式&#xff1f;--要写入数据的表的Schema名称。允许表名中包含“.”是很重要的。目…

NGOSS的一点简单概念

NGOSS&#xff08;Next Generation Operational Support Systems&#xff09;是由TMF&#xff08;Tele Management Forum&#xff09;提出的&#xff0c;他用于电信领域&#xff0c;是构建下一代OSS/BSS系统的框架。TMF提供了技术中立构架&#xff08;TNA&#xff09;作为NGOSS…

Windows Mobile 5.0 设备的目录变化

自定义铃声的默认两个存放位置&#xff1a;1. Application Data\Sounds &#xff08;不是Storage下的Application Data了&#xff09;。2. 外存储设备的根目录。

第二周期的第一次站立会议

今天&#xff1a;对这一阶段的任务进行了分配&#xff0c;我就自己的任务内容搜集了一些资料&#xff0c;尝试了编程。明天&#xff1a;继续进行编程。遇到的问题&#xff1a;编程方面有些许的困难。转载于:https://www.cnblogs.com/guantianhuan/p/10051436.html

常见的函数式编程模型

1.闭包&#xff08;Closure&#xff09; 闭包的概念 可以保留局部变量不被释放的代码块&#xff0c;被称为一个闭包。 闭包的特点&#xff1a;函数嵌套函数、内部函数可以引用外部函数的参数和变量、参数和变量不会被垃圾回收机制收回 // 创建一个闭包 function makeCounter() …

Ubuntu下安装和配置Redis

找到 /ect/redis/redis.conf 文件修改如下:注释掉 127.0.0.1 ,如果不需要远程连接redis则不需要这个操作。使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG。默认情况下,Redis服务器不允许远程访问,只允许本机访问,所以我们需要设置打开远程访问的功能。执行sudo apt-get install redis-server 安装命令。查看 redis 是否启动,重新打开一个窗口。停止/启动/重启redis。

自学笔记——1.Pyhton保留关键字

Python保留关键字python保留的关键字如下python保留的关键字如下 and del from None True as elif global nonlocal try assert else if not while break except import or with class False in pass yield continue finally is raise def for lambda…

人的一生有三件事不能等

人的一生有三件事不能等人的一生有三件事不能等 第一是“贫穷” 贫穷不能等&#xff0c;因为一但时间久了&#xff0c;你将习惯贫穷&#xff0c;到时不但无法突破自我&#xff0c;甚至会抹杀了自己的梦想&#xff0c;而庸庸碌碌的过一辈子。。。。。。 第二是“梦想” 梦想不能…

安装部署中的数据库打包和快捷方式启动浏览器

前一段时间&#xff0c;因为工作的需要&#xff0c;学习了一些.net的部署。在打包的过程中遇到了几个问题&#xff1a;<?XML:NAMESPACE PREFIX O />1、 数据库脚本打包&#xff0c;如何修改Web.config文件中的数据联接2、 数据库脚本中的方法和视图打包时要注意的问题…

Windows下安装和配置Redis

下载版本Redis-x64-5.0.14.1.zip。(可能需要开代理)

python练习册 每天一个小程序 第0004题

1 #-*-coding:utf-8-*- 2 __author__ Deen 3 4 题目描述&#xff1a;任一个英文的纯文本文件&#xff0c;统计其中的单词出现的个数。5 参考学习链接&#xff1a;6 re http://www.cnblogs.com/tina-python/p/5508402.html#undefined7 collections http://blog.csdn.…

xxxxxxx

xxxxxxxxxxxxxxxx转载于:https://www.cnblogs.com/pythonClub/p/10054454.html

自学笔记——2.字符串的切片、遍历、查找字符

一、字符串的切片 字符串的部分片段或者子集称为切片操作&#xff0c;所有字符串的切片操作是通过方括号&#xff08;[ ]&#xff09;实现的&#xff0c;语法&#xff1a;[n : m : s] 会返回一个子字符串&#xff0c;从索引值n到n-1之间&#xff0c;以s为步进&#xff0c;即&a…

【EXLIBRIS】随笔记 011

随 笔 记 <十一> 持这种观点的人一个是Dr. Johnson&#xff0c;另一个是西方文化影响更加根深蒂固的Reverend&#xff0c;似乎英文字母&#xff08;Indian-European family&#xff09;那种“抽象的、率意独断”的符号&#xff08;Wai-lim Yip语&#xff09;才是最基本的…

Ubuntu搭建Spark运行环境

前言 因为之前研究的方向是分布式系统&#xff0c;重点放在了Hadoop分布式文件系统上。现如今&#xff0c;社会对机器学习的需求势如破竹。为了调整研究方向&#xff0c;而且不抛弃原本的研究成果&#xff0c;研究反向便从分布式系统转为分布式机器学习算法&#xff08;刚起步&…

hibernate 和 mybatis 的区别

【转载】&#xff1a;JAVA面试中问及HIBERNATE与 MYBATIS的对比&#xff0c;在这里做一下总结转载于:https://www.cnblogs.com/virgosnail/p/10054987.html

VC中基于 Windows 的精确定时

方式一&#xff1a;VC中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数SetTimer()设置定时 间隔&#xff0c;如SetTimer(0,200,NULL)即为设置200ms的时间间隔。然后在应用程序中增加定时响应函数 OnTimer()&#xff0c;并在该函数中添加响应的处理语句&#xff0c;用来…

VMware虚拟机安装之后,打开时找不到启动Centos的界面

#VMware虚拟机安装之后&#xff0c;打开时找不到启动Centos的界面 只要在VMware中打开查看–自定义–库&#xff0c;之后就看到自己已经创建好的虚拟机系统 我也是因为自己不小心上次关机之前把左边那个窗口关闭了

service iptables status无法执行,报错

1. service iptables status 结果为edirecting to /bin/systemctl stop iptables.service Failed to stop iptables.service: Unit iptables.service not load 3.安装Iptables-services 在root 用户下&#xff0c;执行指令 yum installl iptables-services3.设置开机启动 …

Qt5的cmake文件位置

D:\APICenter\Qt\Qt5.8.0\5.8\msvc2015\lib\cmake\Qt5\Qt5Config.cmake转载于:https://www.cnblogs.com/coolbear/p/7149079.html

2018-12-2

博客第一天&#xff0c;今天申请通过&#xff0c;我以为我上个星期就已经申请通过了。没想到博客还得申请一下&#xff0c;哈哈&#xff0c;今天终于成功了&#xff0c;加油哦转载于:https://www.cnblogs.com/h-wei/p/10056227.html

重载、重写和隐藏

重载、重写和隐藏 重载、重写和隐藏是很容易混淆的类似概念。虽然所有这三种技术都使您得以创建同名的成员&#xff0c;但它们之间有一些重要的差异。 重载的成员用于提供属性或方法的不同版本&#xff0c;这些版本具有相同名称但是接受不同数量的参数或者接受不同数据类型的参…

[整理] - Relational Engine之UMS Internals

SQL Server 6.5使用Windows的调度处理管理多线程&#xff0c;和其它Windows应用程序一样&#xff0c;它使用Windows标准API&#xff0c;没有用到任何隐藏API&#xff0c;这使得 SQL Server的工作线程同其它多线程Windows程序完全一样&#xff0c;没有任何特殊的优先级&#xff…

跟踪workflow instance 状态

场景是这样的: 1.workflowruntime启动了持久化和监听服务 2.workfllowruntime创建多个实例,并启动,一些会长时间延时,一些会中途暂停,会不同的执行状态(业务状态) 3.另有一winform控制台,有个表格,刷新显示每个实例的信息,包括业务状态--比如创建,运行,挂起等 4.通过workflowru…