- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
西北师范大学地环学院地理信息系 数据结构实验讲义 二 栈 C语言实现 张长城 2011-2-8
[顺序表构造栈]
一 栈的基本原理分析
作为栈这种数据结构,数据是进行所谓的先进后出操作,但栈在操作中,并不需要在中间插入删除操作、一般也不需要在进栈数据中查找什么,这种情况下,恰恰是顺序表可以完成的非常好的场合,所以栈经常是用一个简单的数组即可完成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #includestdio.h
int s[100];
int top=0;
void push(int e)
{
s[top]=e;
top++;
}
int pop()
{
top--;
return s[top];
}
main()
{
int i;
for(i=0;i10;i++)
push(i);
for(i=0;i10;i++)
printf(%d\n,pop());
} 最简单的栈程序,见s0.c 这个程序就能完成最简单的栈的程序,原理也很简单。
对栈的应用,比如把10进制数1348转换成8进制,则过程是:
商 余
1348/8 168 4
168/8 21 0
21/8 2 5
2/8 0 2
这个结果就是2504,但从计算步骤上看:它的结果次序是反的,是4、0、5、2,如果把余数的结果先保存进栈,则出栈恰好是正确的结果。
略微修改s0.c就可完成这个工作。这个算法适合任何进制数据转换。
1
2
3
4
5
6
7
8
9
10
11
12 main()
{
int N=1348;
while(N)
{
push(N%8);
N=N/8;
}
while(top0)
printf(%d,pop());
printf(\n);
} 最简单的栈应用程序,见s0.c
但这个程序有很大的问题:
1 仅仅有一个栈空间,程序如果要用多个栈、则要说明很多s[]、top之类的变量;
2 这个栈也仅仅能进出int类型的数据,如果是多种类型数据组成的表格,则不能处理;
所以上述程序仅是个原理示范性的程序,在更加广泛的情况下不能用,它太简单了。
要对任意类型的表进行栈操作,那就找C#的泛型或者JavaScript吧,在C这里,我们依然最一个简单的特定的表格进行栈处理,这个表就是:
struct ElemType
{
char c;
int iData;
long lData;
char sData[20];
};
这是个包含字符、整数、长整数、字符串的表,表本身或许没什么现实意义。根据栈的原理,我们知道设计栈不需要链表、顺序表已经足够好了。所以设计一个表示栈的表就是:
struct sqStack
{
struct ElemType *base,*top;
int Count,Size;
};
这个表中*base指针代表栈空间的首地址;*top代表栈空间的栈顶地址;
Count代表进栈数据元素的个数,也就是说进栈数据有多少行;
Size代表栈的最大空间,也就是说栈最大能容纳多少行数据。
这个表实际相当于顺序表的目录表,它能使访问栈更加容易。所以编程的整体路线也将同顺序表、链表中做的那样:不断补充函数。
1 栈的初试化
所谓栈的初始化,就是构造一个指定空间的存储单元,并且给出这片空间的首地址,这个手段在顺序表、链表的编程中已经很熟悉了。
如果指定栈的空间是Size,那么就意味着为ElemType这样的表申请Size行的存储空间,写成C语言就是:
struct ElemType *p;
p=(struct ElemType *)malloc(sizeof(struct ElemType)*Size);
当然,要把这个结果存储到栈目录表seqStack中,所以:
struct seqStack *s;
s=(struct seqStack *)malloc(sizeof(struct seqStack));
s-base =p;s-top=p;s-Count =0;s-Size =Size;
注意编程要点:这里的表s 保存的最重要数据就是:当前栈中数据的行数Count、以及栈的最大容量。当然,在空栈的情况下,栈顶指针和栈的存储空间首地址是一致的。整个函数就是:
1
2
3
4
5
6
7
8
9 struct s
您可能关注的文档
最近下载
- 立创EDA操作手册公开课.pdf
- 《共享单车点位设置导则》.pdf VIP
- 体育概论 第三版 杨文轩 陈琦 全国普通高等学校体育专业类基础课程教材-第二章 体育功能.ppt VIP
- 湖南省新高考教学教研联盟暨长郡二十校联盟2024-2025学年高一下学期5月检测数学试卷含答案.docx VIP
- 2025老年人健康膳食指南(精华版).pptx
- 体育概论 第三版 杨文轩 陈琦 全国普通高等学校体育专业类基础课程教材-第四章 体育过程.ppt VIP
- 沙场供沙合同范本.docx VIP
- 八年级上册物理同步练习题(全)-人教版.doc VIP
- 基孔肯雅热防控技术指南2025年版培训课件.pptx VIP
- 《创意综合材料绘画》课件.ppt VIP
文档评论(0)