数据结构(严蔚敏)之三——顺序栈之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;elsereturn 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语言实现相关推荐
- [数据结构-严蔚敏版]P48栈的链式表示
代码如下: #include <iostream> using namespace std;typedef int ElemType;typedef struct SNode {ElemT ...
- [数据结构-严蔚敏版]P46栈的顺序存储表示
大家如果发现代码有错误,麻烦评论告知一下!!! 代码如下: #include <iostream> using namespace std;const int STACK_INIT_SIZ ...
- 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...
1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...
- 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码
数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...
- 数据结构 严蔚敏 第二章 线性表
数据结构 严蔚敏 第二章 线性表 线性表:由n个(n>=0)数据特征相同的元素构成的有限序列. 线性表的类型定义表示和实现 顺序表 存储单元地址连续 随机存取 若每个元素占用 m 个存储单元,以 ...
- 【计算机】数据结构-严蔚敏/清华大学P3
[计算机]数据结构-严蔚敏/清华大学P1 第二章 线 性表 线性结构 是 一个数据元素的有序(次序)集 线性结构的基本特征: 1. 集合中必存在唯一的一个"第一元素": ...
- 数据结构实验(严蔚敏版)----栈与队列
数据结构(严蔚敏版)配套实验报告册--栈与队列基本操作 #include <stdio.h> #include <malloc.h> #include <stdlib.h ...
- 数据结构C++实现(顺序栈) 青岛大学王卓老师
b站 <数据结构与算法基础(青岛大学-王卓)> 所用教材<数据结构C语言版第二版> 中国工信出版集团 人民邮电出版社出版 严蔚敏 编著 #include<iostrea ...
- 数据结构----严蔚敏
最近一直想找一本纯数据结构的书来学习,找来找去都没有找到一本合适的书籍,相比之下国内的书籍之中,严蔚敏和吴伟民的还算是经典版了,很多国内其他数据结构教材都参考这本书的.但缺点是很多都是伪代码,对编程初 ...
最新文章
- 03系统多界面_领克03+冠军版定制版车联系统全网首测,性能+智能它都给你
- [转载] 七龙珠第一部——第125话 神将登场
- 【转】Xcode7.1环境下上架iOS App到AppStore 流程 -- 不错!!
- 如何在Java地毯下有效地清除问题
- spacy model
- [转载] Python判断分数等级if...elif...else
- python打包加壳_转:Python用PyInstaller打包笔记
- 苹果手机屏幕镜像搜索不到电视_手机自带的无线投屏总说找不到设备?
- 怎样将优酷视频编码KUX转MP4视频格式
- 正弦和余弦(角度到弧度)
- 《那些年啊,那些事——一个程序员的奋斗史》——77
- 2022Java后端学习主流知识学习系列(建议先收藏)
- Swoole入门指南:PHP7安装Swoole详细教程(一) 1
- 网络栈主要结构介绍(socket、sock、sk_buff,etc)
- UVA10765 Doves and bombs(双连通分量)
- SpringMVC整合Redis实战
- 诚之和:Python数据科学使用numpy求行均值
- 拆掉思维里的墙 读书笔记
- Symantec Endpoint Protection 中如何设置白名单
- 牛课网--直通BAT面试算法精讲课{10元优惠码}