数据结构(C语言版)之栈及递归
目录
前言
正文
一、栈
1.栈的概念及术语
1.定义
2.逻辑结构
3.存储结构
4.运算规则
5.实现方式
6.栈是一种特殊的线性表,它的逻辑结构和存储结构与线性表相同,其特殊性体现在“运算受限” 。
2.栈的特点
二、栈的表示及基本操作
1.顺序栈
顺序栈的类型定义
说明
顺序栈的算法实现
2.链栈
链栈的类型定义
说明
链栈的算法实现
三、栈与递归
递归的定义
以下三种情况常常用到递归方法
总结:
前言
●数据结构作为计算机专业基础课,综合性强,抽象性高,在一定程度上增加了学习难度,本次我们共同从数据结构的基础探讨,由浅入深进行数据结构的学习。
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!●本文只浅显的探讨了栈的基本知识,作者相信随着学习课程的深入,我们将会对数据结构有更深的理解与收获!
正文
————————————————
一、栈
1.栈的概念及术语
1.定义
只能在表的一端(栈顶)进行插入和删除运算的线性表
2.逻辑结构
与线性表相同,仍为一对一关系
3.存储结构
用顺序栈或链栈存储均可,但以顺序栈更常见
4.运算规则
只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则
5.实现方式
关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同 基本操作有入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等
6.栈是一种特殊的线性表,它的逻辑结构和存储结构与线性表相同,其特殊性体现在“运算受限” 。
限制在表的一端进行插入和删除操作。 能够进行操作的一端是浮动端,称之为栈顶,通常用一个“栈顶指针”指示,它的位置会随着操作而发生变化;与此相对,表的另一端是固定端,称之为栈底。 如同线性表可以为空表一样,当栈中没有元素时称为空栈。往栈中插入元素的操作称为入栈,删除栈中元素的操作称栈 。
2.栈的特点
二、栈的表示及基本操作
1.顺序栈
顺序栈的类型定义
#define MAXSIZE 100 typedef struct { DataType data[MAXSIZE];int top; }SqStack;
说明
在顺序栈中,用于指示栈顶的当前位置的top是整型,它的实质是栈顶元素在数组中的下标。 栈顶指针top直接反映出栈的当前状态:空栈时,栈顶指针top为-1;
栈满时,栈顶指针top为MAXSIZE-1;
入栈时,栈顶指针top加1;
出栈时,栈顶指针top减1。
栈底位置固定不变,可以设置在数组的任意端,一般习惯上将数组低下标端作为栈底。
顺序栈的算法实现
(1)初始化栈(置栈空) 初始化栈主要是分配存储空间,并将栈顶指针置为-1。 int InitStack(SqStack &S) { //构造一个空栈S.top= -1;return OK; }(2)判栈空 int StackEmpty(SqStack S) //判栈为空栈时返回值为真,反之为假 { return(S.top==-1? TRUE:FALSE);} (3)判栈满 int StackFull(SqStack S) //判栈为满栈时返回值为真,反之为假 { return(S.top==MAXSIZE-1?TRUE:FALSE);}(4)进栈 进栈时应首先判栈满,若栈不满则将栈顶指针top上移,存入元素。 int Push(SqStack &S, DataType e) { //将元素e插入到栈中,作为的新栈顶if(StackFull(S)) return ERROR; //栈满S.top++; // top加1,栈顶位置上移S.data[S.top]=e; //数据e存入当前栈顶return OK; }(5)出栈 出栈时应首先判断栈是否为空,若栈不为空,则取出栈顶元素,将栈顶指针top下移,再返回栈顶元素。 int Pop(SqStack &S,DataType &e) {//若栈不为空,则删除栈顶元素if(StackEmpty(S)) return ERROR; //栈空e=S.data[S.top]; //取出数据放入e所指单元中S.top--; // top减1,栈顶位置下移return OK; }(6)取栈顶元素1 int GetTop(SqStack S,DataType &e) {//若栈不为空,则取栈顶元素if(StackEmpty(S)) return ERROR; //栈空e=S.data[S.top]; //取出数据,top不变return OK; }(6)取栈顶元素2 DataType GetTop(SqStack S) {//若栈不为空,则取栈顶元素DataType e;if(StackEmpty(S)) return ERROR; //栈空e=S.data[S.top]; //取出数据,top不变return e; }
2.链栈
链栈的类型定义
链栈:通常用一个无头结点的单链表表示,其结点结构与单链表的结点结构相同。
typedef struct node { DataType data;struct node* next; } StackNode,*LinkStack; LinkStack top; //top为栈顶指针
说明
对于单链表来说,在表头插入和删除结点要比在表尾相对简单,因此将单链表表头作为栈顶,则单链表的头指针即为栈顶指针。
链栈的算法实现
链栈的本质是简化的单链表,top作为栈顶指针始终指向链表首结点。进栈操作就是在链表表头插入一个新的结点,出栈操作就是删除当前的表头结点并释放空间。
(1)初始化栈(置空栈) LinkStack InitStack() //空栈的top指针为NULL { return NULL; } (2)判栈空 int StackEmpty(LinkStack top) //判栈为空栈时返回值为真,反之为假 { return(top==NULL? TRUE:FALSE); } (3)进栈 void Push(LinkStack top, DataType e) { //将元素e进链栈,即在表头插入新的结点StackNode *s;s=(StackNode*)malloc(sizeof(StackNode));s->data=e;s->next=top;top=s; } (4)出栈 int Pop(LinkStack top,DataType &e) { //若栈不为空将栈顶元素出栈,即为删除表头结点StackNode *p;if(StackEmpty(top)) return ERROR; //栈空e=top->data;p=top;top=top->next;free(p);retrun OK; }
三、栈与递归
递归的定义
若一个对象部分地包含它自己, 或用它自己给自己定义, 则称这个对象是递归的;
若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。
long Fact ( long n ) {if ( n == 0) return 1;else return n * Fact (n-1); }
以下三种情况常常用到递归方法
递归定义的数学函数
具有递归特性的数据结构
可递归求解的问题
总结:
本文共同探讨了栈的相关内容,在日常生活中有极其丰富的应用,作者认为要认真对待数据结构的学习,搭建基本知识框架,随着日积月累的学习逐渐填补总结,从脚踏实地做起,祝愿大家能够熟悉掌握这门课程,并将其能够熟悉的应用!
耐心看到这里的小伙伴一定很棒!加油!路在脚下,梦在前方!
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
数据结构(C语言版)之栈及递归相关推荐
- 《数据结构C语言版》——栈和队列详解(图文并茂),从零开始的学习
哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...
- 《数据结构C语言版》-栈的概念和栈的实现
目录 概念 思路和源代码 思路 源代码 头文件(主题框架) 源文件,各个接口的实现 结构体的初始化 压栈 出栈 判断是否为空 获取栈顶元素 获取元素个数 销毁 test.c源文件(main函数所在的. ...
- 数据结构(C语言版)顺序栈相关算法的代码实现
这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...
- 数据结构(C语言版)——顺序栈(代码版)
一.代码 #include <stdio.h> #include <stdlib.h>#define MAXSIZE 10 #define OK 1 #define ERROR ...
- 数据结构(C语言版)——链栈(代码版)
一.代码 #include <stdio.h> #include <stdlib.h>#define OK 1 #define ERROR 0typedef int Statu ...
- c语言动态双端栈的原理,数据结构(C语言版)例题(第三章:栈和队列)
数据结构(C语言版)例题(第三章:栈和队列) 数据结构(C语言版)例题(第三章:栈和队列) (2008-05-09 12:33:13) 转载▼ ◆3.15③ 假设以顺序存储结构实现一个双向栈,即在一维 ...
- 【数据结构 C语言版】第六篇 栈、队列经典必刷面试考研题
[数据结构 C语言版]第六篇 栈.队列经典必刷面试考研题 写在前面 更新情况记录: 最近更新时间 更新次数 2022/10/20 1 参考博客与书籍以及链接: (非常感谢这些博主们的文章,将我的一些疑 ...
- 邓公数据结构C++语言版学习笔记——二叉树
二叉树的遍历 一. preorder--先序遍历VLR 1. 递归先序遍历 2. 迭代先序遍历 3.先序遍历图解 二. inorder--先序遍历LVR 1. 递归中序遍历 2.迭代中序遍历 3.迭代 ...
- 邓公数据结构C++语言版学习笔记1
1. 对于计算幂2n2^n2n的算法优化 暴力算法时间复杂度O(n)O(n)O(n) __int64 power2BF_I(int n) //幂函数2^n算法(蛮力迭代版),n >= 0{ __ ...
- 数据结构c语言版第16页,数据结构c语言版
数据结构c语言版[编辑] 概述 <数据结构C语言版>本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及综合分析比较 出版信息 ...
最新文章
- python语言自学-【经验分享】自学Python的学习顺序!附学习资料
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
- .NET Core 3.0之深入源码理解ObjectPool(二)
- 密码学 专题 DH密钥交换算法
- java 随机生成图,Java中的快速实值随机生成器
- AI 赛道“新选手”锐捷发布新一代 AI SaaS 云平台,支撑百万级零售货柜
- delhpi7 tcombobox清楚重复项_数据分析必须想清楚的两个概念:指标和维度
- android 水印背景功能,Android 给View添加剧复的文字水印背景 相似钉钉通信录的背景效果...
- (七)对Jmeter进行参数化的俩种方式
- C# AHP层次分析法:一致性校验
- PLC温室大棚自动控制系统
- 模式的模式:从设计模式到元模式
- 后台管理系统——登录功能
- 淘宝+Selenium
- Pytorch 如何计算三角函数
- 嵌入式截屏工具-gsnap移植 arm平台
- 2021-11-26 股票模拟交易心得1
- 史蒂夫•乔布斯在斯坦福大学的演讲
- Cronette 1.9 Mac 破解版 定时执行任务管理应用
- 为什么老人会腰酸背痛和肌肉无力?