顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)
1 #include
2 #include
3 #define STACK_INIT_SIZE 100//储存空间初始分配量
4 #define STACKINCREMENT 10//存储空间分配增量
5 #define OK 0
6 #define ERROR 1
7 typedef int StackType; //栈元素类型
8
9 typedef struct{10 StackType *base; //在构造之前和销毁之后,base的值为NULL
11 StackType *top; //栈顶指针
12 int stacksize; //当前已分配的存储空间,以元素为单位
13 }SqStack; //顺序栈14
15 //栈的初始化
16 int InitStack(SqStack *p) {17
18
19 p->base = (StackType*)malloc(STACK_INIT_SIZE * sizeof(StackType));20 if (p->base == NULL) return ERROR; //内存分配失败
21 p->top = p->base; //栈顶与栈底相同表示一个空栈
22 p->stacksize =STACK_INIT_SIZE;23 returnOK;24
25 }26 //判断栈是否为空
27 int EmptyStack(SqStack *p) {28 //若为空栈 则返回OK,否则返回ERROR
29 if (p->top == p->base) returnOK;30 else returnERROR;31 }32 //顺序栈的压入
33 int Push(SqStack *p,StackType e) {34 //插入元素e为新的栈顶元素
35 if ((p->top - p->base)>= p->stacksize) //栈满,追加储存空间
36 {37 p->base = (StackType*)realloc(p->base, (p->stacksize + STACKINCREMENT) * sizeof(StackType));38 if (p->base == NULL) return ERROR;//储存空间分配失败
39 p->top = p->base + p->stacksize;40
41 /*p->top = p->base + p->stacksize;这句是有必要加上的42 这一个问题的关键在于 realloc 是怎么实现的,有两种情况:43 如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。44 这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时,45 realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。46 也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。47 那么就ok。得到的是一块连续的内存。48 如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。49 并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。50 如果是第二种情况的话,s->top 就不是原来的 top 了--百度百科*/
51
52 p->stacksize +=STACKINCREMENT;53 }54 *(p->top) =e;55 (p->top)++;56 returnOK;57 }58 //顺序栈的弹出
59 int Pop(SqStack *p,StackType *e) {60 //若栈不空,则删除p的栈顶元素,用e返回其值
61 if (p->top == p->base) returnERROR;62 --(p->top);63 *e = *(p->top);64 returnOK;65
66
67 }68 //顺序栈的销毁
69 int DestroyStack(SqStack *p) {70 //释放栈底空间并置空
71 free(p->base);72 p->base =NULL;73 p->top =NULL;74 p->stacksize = 0;75
76 returnOK;77 }78 //将顺序栈置空 栈还是存在的,栈中的元素也存在,如果有栈中元素的地址任然能调用
79 int ClearStack(SqStack *p) {80 p->top= p->base;81 returnOK;82 }83 //返回顺序栈的元素个数
84 intStackLength(SqStack p) {85 //栈顶指针减去栈底指针等于长度,因为栈顶指针指向当前栈顶元素的下一个位置
86 return p.top - p.base;87 }88 //返回顺序栈的栈顶元素
89 int GetTop(SqStack *p, StackType *e) {90 //若栈不为空,则用e返回p的栈顶元素
91 if (p->top > p->base) {92 *e = *(p->top - 1); returnOK;93 }94 else returnERROR;95 }96 //从栈顶到栈底对每个元素调用某个函数
97 int StackTraverse(SqStack p,void (*pfun)(StackType)/*函数指针*/){98 //从栈底到栈顶依次对栈中的每个元素调用函数pfun()
99 while (p.top > p.base)100 pfun(*(p.base)++); //先调用后递增
101 printf("\n");102 returnOK;103 }104 //打印栈中元素
105 voidprint(StackType stack) {106 printf("%d\n", stack);107
108 }109 //测试栈的各种操作
110 intmain() {111 intn,i;112 StackType *e,a;113 SqStack *pstack,stack;114 pstack = &stack;115 e=(StackType*)malloc(sizeof(StackType)); //为指针e分配内存地址
116 InitStack(pstack); //初始化栈
117
118 if (EmptyStack(pstack) == 0) printf("-------栈为空-------\n");119 printf("请输入栈的元素个数:");120 scanf("%d", &n);121 for (i = 0; i < n; i++)122 {123 scanf("%d", &a);124 Push(pstack, a);125 }126 if (EmptyStack(pstack) == 1) printf("-------栈不为空-----\n");127
128 printf("栈的长度为:%d\n", StackLength(stack));129 printf("--------------------\n");130 printf("请输入一个入栈元素:");131 scanf("%d", &a);132 Push(pstack, a);133 printf("--------------------\n");134 printf("栈中的元素个数为:%d\n", StackLength(stack));135 printf("--------------------\n");136 GetTop(pstack, e);137 printf("栈顶元素为:%d\n", *e);138 printf("--------------------\n");139 printf("打印栈中的元素:\n");140 StackTraverse(stack, print);141 printf("---弹出栈顶元素---\n");142 Pop(pstack, e);143 printf("弹出的栈顶元素为:%d\n", *e);144 printf("--------------------\n");145 GetTop(pstack, e);146 printf("栈顶元素为:%d\n", *e);147 printf("--------------------\n");148 printf("打印栈中的元素:\n");149 StackTraverse(stack, print);150 printf("--------------------\n");151
152 printf("----------清空栈-------\n");153 if (ClearStack(pstack) == 0) printf("已清空栈\n");154
155 printf("----------销毁栈-------\n");156 if (DestroyStack(pstack) == 0) printf("已销毁栈\n");157 return 0;158
159 }
顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)相关推荐
- 温控系统c语言源代码,模糊PID控制温控系统设计C语言程序代码
<模糊PID控制温控系统设计C语言程序代码>由会员分享,可在线阅读,更多相关<模糊PID控制温控系统设计C语言程序代码(17页珍藏版)>请在人人文库网上搜索. 1.模糊PID控 ...
- C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)
//顺序栈的基本操作 #include<stdio.h> #define MaxSize 50 typedef int ElemType; //定义栈结构体 typedef struct ...
- 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)
文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...
- 数据结构动态顺序字符串基本操作实验_技术连载:数据结构 - 栈
栈 只有一个口,可以进数据也可以出数据,一种典型的先进后出.后进先出的数据结构: 栈 栈的基本操作 入栈 入栈操作需要考虑当前栈是否以及满了,如果满了是选择扩容还是返回入栈失败: 入栈成功则需要更新栈 ...
- c语言栈的实现以及操作_C++语言实现顺序栈
在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以看看之前的文章,下面是链接C语言实现顺序栈在这 ...
- c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?
看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...
- 实现顺序栈的各种基本运算的算法C语言,实现顺序栈的各种基本运算的算法
试编写一个算法,让两个顺序栈共用一个数组stack[N]试编写一个算法,让两个顺序栈共用一个数组stack[N],分别实现入栈\出栈操要2个栈公用一个存储空间看来栈顶指针只能从两端开始了(和队列有点像 ...
- C语言实现顺序栈心得
栈的构成及初始化 对于"先进后出"的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量. 栈容量即栈的最大容量,若超过会产生溢出错误.当然,必要时也可以扩充容量. 栈元素可以通过动态 ...
- C语言--实现顺序表的基本操作
一.预备知识(先说到这么多,具体问题和所需的内容在后面的编程中再说) 1.开发环境和开发语言: 环境:visual studio 2019 语言:C 2.形参的生命周期(一定要明白形参的生存周期,特别 ...
最新文章
- Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四)
- Java Eclipse进行断点调试
- QT发布中遇到的问题 - wufan的专栏 - 博客频道 - CSDN.NET
- Retrofit2.0和Rxjava结合使用的简单记录
- 程序员保值的5个秘密
- unity fixedupdate_unity相关
- spring零碎知识点(二)
- nginx系列之七:限流配置
- oracle静默安装访问数据库慢,Oracle数据库静默安装总结
- java 小数如何转换成百分数_初等数学33-百分数
- 导体、良导体、超导体与半导体
- 《Dreamweaver CS6完美网页制作——基础、实例与技巧从入门到精通》——1.2 网页的基本构成元素...
- 【手册】jc-cookies 中文文档
- Android代码如何监控apk安装 卸载 替换
- C# FTP 命令无法获取ServerU目录列表问题
- 计算机主板 hdmi接口,主板上HDMI接口的用途是什么?主机后面的HDMI应该是
- 【云游戏】携手云流送,让普通终端也可畅享高端游戏画质
- Cookie.js 源码解析
- 机器阅读理解论文必读论文(二): Teaching Machines to Read and Comprehend
- 深圳职业技术学院计算机专业分数线,2016深圳职业技术学院分数线
热门文章
- Go语言逆向技术:恢复函数名称算法
- 华为云PB级数据库GaussDB(for Redis)解析第二期:Redis消息队列Stream的应用探讨
- redis分布式锁的这些坑,我怀疑你是假的开发
- 华为云FusionInsight MRS:助力企业构建“一企一湖,一城一湖”
- 补习系列(10)-springboot 之配置读取
- matepad适配鸿蒙,消息称华为 MatePad2 搭载骁龙888 4G 华为鸿蒙OS计划适配高通平台...
- 根据企业财务进行风险分析——基于pytorch
- latex参考文献BibTeX的使用方法
- Python练习:求100以内的素数和
- ndoejs中中间件的使用