C语言数据结构之栈简单操作

实验:
编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
(1)初始化顺序栈
(2)插入元素
(3)删除栈顶元素
(4)取栈顶元素
(5)遍历顺序栈
(6)置空顺序栈
分析:
栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。
对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p->top= =MAXNUM-1,栈满时,不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢。
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空作为一种控制转移的条件。
注意:
(1)顺序栈中元素用向量存放
(2)栈底位置是固定不变的,可设置在向量两端的任意一个端点
(3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置
顺序栈的实现:
#include <stdio.h>
#include <malloc.h>
typedef int SElemType;
typedef int Status;
#define INIT_SIZE 100
#define STACKINCREMENT 10
#define Ok 1
#define Error 0
#define True 1
#define False 0
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化栈
Status InitStack(SqStack *s)
{
s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base;
s->stacksize = INIT_SIZE;
return Ok;
}
//清空栈
Status ClearStack(SqStack *s)
{
s->top = s->base;
return Ok;
}
//栈是否为空
Status StackEmpty(SqStack *s)
{
if(s->top == s->base)
return True;
else
return False;
}
//销毁栈
Status Destroy(SqStack *s)
{
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize=0;
return Ok;
}
//获得栈顶元素
Status GetTop(SqStack *s, SElemType &e)
{
if(s->top == s->base) return Error;
e = *(s->top - 1);
return Ok;
}
//压栈
Status Push(SqStack *s, SElemType e)
{
if(s->top - s->base >= s->stacksize)//栈满
{
s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base + s->stacksize;//修改栈顶位置
s->stacksize += STACKINCREMENT;//修改栈长度
}
*s->top++ = e;
return Ok;
}
//弹栈
Status Pop(SqStack *s, SElemType *e)
{
if(s->top == s->base) return Error;
--s->top;
*e = *(s->top);
return Ok;
}
//遍历栈
Status StackTraverse(SqStack *s,Status(*visit)(SElemType))
{
SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构
SElemType *t = s->top;
while(t > b)
visit(*b++);
printf("\n");
return Ok;
}
Status visit(SElemType c)
{
printf("%d ",c);
return Ok;
}
测试代码:
int main()
{
SqStack a;
SqStack *s = &a;
SElemType e;
InitStack(s);
int n;
puts("请输入要进栈的个数:");
scanf("%d", &n);
while(n--)
{
int m;
scanf("%d", &m);
Push(s, m);
}
StackTraverse(s, visit);
puts("");
puts("8进栈后:");
Push(s, 8);
StackTraverse(s, visit);
puts("");
Pop(s, &e);
printf("出栈的元素是:%d\n", e);
printf("元素出栈后事实上并没有清除,依然存在于内存空间,所谓的出栈只是指针移动,出栈的元素是%d\n", *s->top);//判断出栈后元素是否还存在于内存中
Destroy(s);
return 0;
}
运行结果:
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C语言数据结构之栈简单操作
# 数据结构
# 栈的实例
# C语言实现通用数据结构之通用椎栈
# C语言数据结构进阶之栈和队列的实现
# C语言编程数据结构栈与队列的全面讲解示例教程
# C语言编程数据结构的栈和队列
# C语言数据结构之使用链表模拟栈的实例
# C语言数据结构 栈的基础操作
# 详解C语言数据结构之栈
# 为空
# 遍历
# 上溢
# 主程序
# 它是
# 希望能
# 请输入
# 谢谢大家
# 在此基础上
# 清空
# 整型
# 事实上
# stdio
# malloc
# include
# lt
# define
# Status
# INIT_SIZE
相关文章:
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在IIS中新建站点并配置端口与IP地址?
如何在香港服务器上快速搭建免备案网站?
h5在线制作网站电脑版下载,h5网页制作软件?
建站之星免费版是否永久可用?
招商网站制作流程,网站招商广告语?
威客平台建站流程解析:高效搭建教程与设计优化方案
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何快速上传建站程序避免常见错误?
简单实现Android验证码
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何选择适合PHP云建站的开源框架?
建站主机服务器选型指南与性能优化方案解析
常州自助建站工具推荐:低成本搭建与模板选择技巧
在线制作视频网站免费,都有哪些好的动漫网站?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
IOS倒计时设置UIButton标题title的抖动问题
jQuery 常见小例汇总
北京制作网站的公司,北京铁路集团官方网站?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
已有域名和空间如何搭建网站?
建站之星后台管理:高效配置与模板优化提升用户体验
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何选择网络建站服务器?高效建站必看指南
网站制作软件免费下载安装,有哪些免费下载的软件网站?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
如何在七牛云存储上搭建网站并设置自定义域名?
PHP正则匹配日期和时间(时间戳转换)的实例代码
实例解析Array和String方法
专业公司网站制作公司,用什么语言做企业网站比较好?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
表情包在线制作网站免费,表情包怎么弄?
如何在建站主机中优化服务器配置?
香港服务器租用每月最低只需15元?
如何基于云服务器快速搭建个人网站?
如何在IIS7上新建站点并设置安全权限?
c# await 一个已经完成的Task会发生什么
学校建站服务器如何选型才能满足性能需求?
建站主机CVM配置优化、SEO策略与性能提升指南
如何通过万网虚拟主机快速搭建网站?
建站之星如何助力企业快速打造五合一网站?
婚礼视频制作网站,学习*后期制作的网站有哪些?
大连网站制作公司哪家好一点,大连买房网站哪个好?
建站主机如何选?性能与价格怎样平衡?
建站之星多图banner生成与模板自定义指南
如何配置WinSCP新建站点的密钥验证步骤?
如何在建站之星绑定自定义域名?
*请认真填写需求信息,我们会在24小时内与您取得联系。