数据结构《顺序栈》知识点详解+C语言完整代码-超详细
顺序栈
- 栈
- 1. 定义
- 2. 逻辑结构
- 3. 存储结构
- 4. 运算规则
- 5. 实现方式
- C语言代码实现
- 1. 顺序栈的表示
- 2. 结构体
- 3.初始化
- 4.入栈
- 5.出栈
- 6. 取栈顶元素
- 7.求长
- 8.打印
- 9.全部代码
- 10.运行图
- 栈的应用举例
- 1.数制转换
- 2.括号匹配的检验
- 3.行编辑程序问题
- 4.迷宫求解
- 5.表达式求值
- 6.实现递归
栈
1. 定义
栈:只能在表的一端(栈顶)进行插入和删除运算的线性表。
2. 逻辑结构
与线性表相同,仍为一对一关系。
3. 存储结构
用顺序栈或链栈存储均可,但以顺序栈更常见。
4. 运算规则
只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则。
5. 实现方式
关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。基本操作有入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等。
C语言代码实现
1. 顺序栈的表示
2. 结构体
结构体定义代码
如下:
typedef int Status;
typedef int SElemType;
typedef struct {SElemType *top; //栈顶指针SElemType *base; //栈底指针int stacksize; //栈可用的最大容量
}SqStack;
3.初始化
构造一个空栈
(1)分配空间并检查空间是否分配失败,若失败则返回错误
(2)设置栈底和栈顶指针
(3)设置栈大小
初始化代码
如下:
//顺序栈的初始化
Status Initstack(SqStack &S)
{//构造一个空栈SS.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType));//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间if (!S.base)exit(OVERFLOW); //存储分配失败S.top=S.base; //top初始为base,空栈S.stacksize=MAXSIZE; //stacksize置为栈的最大容量MAXSIZEreturn 1;
}
4.入栈
(1)判断是否栈满,若满则出错
(2)元素x压入栈顶
(3)栈顶指针加1
入栈代码
如下:
//顺序栈的入栈
Status Push(SqStack &S,SElemType x){// 插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize)return 1;//栈满*S.top=x;//元素x压入栈顶S.top++;//栈顶指针加1//*(S.top++) = x; return 0;
}
5.出栈
(1)判断是否栈空,若空则出错
(2)获取栈顶元素x
(3)栈顶指针减1
出栈代码
如下:
//顺序栈的出栈
Status Pop(SqStack &S,SElemType &x){//删除S的栈顶元素,用e返回其值if(S.top==S.base)return 1;//栈空S.top--;//栈顶指针减1x=*S.top;//将栈顶元素赋给xreturn 1;
}
6. 取栈顶元素
(1)判断是否空栈,若空则返回错误
(2)否则通过栈顶指针获取栈顶元素
去栈顶元素代码
如下
//取顺序栈的栈顶元素
Status get(SqStack &S,SElemType &x)
{//返回S的栈顶元素,不修改栈顶指针if(S.top==S.base)return 1;//栈空x= *(S.top-1);return x;//返回栈顶元素的值,栈顶指针不变
}
7.求长
求长代码
如下
//求顺序栈的长度
int Stacklength(SqStack S){if(S.top==S.base)return 0;S.stacksize=S.top-S.base;return S.stacksize;
}
或者
int Stacklength(SqStack S){return S.top – S.base;
}
8.打印
打印顺序栈代码
如下
//打印顺序栈
Status print(SqStack S){int len= Stacklength(S);int i,e;for(i=1;i<=len;i++){e=*(S.top-i);printf("%5d",e);}return 1;
}
9.全部代码
全部代码
如下
/***顺序栈的实现***/
#include "stdio.h"
#include <stdlib.h>
//顺序栈定义
#define MAXSIZE 100//顺序栈存储空间的初始分配量
typedef int Status;
typedef int SElemType;
typedef struct {SElemType *top;SElemType *base;int stacksize;
}SqStack;
//初始化
Status Initstack(SqStack &S)
{S.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType));S.top=S.base;S.stacksize=MAXSIZE;return 1;
}
//入栈
Status Push(SqStack &S,SElemType x){if(S.top-S.base>=S.stacksize)return 1;*S.top=x;S.top++;return 0;
}
//出栈
Status Pop(SqStack &S,SElemType &x){if(S.top==S.base)return 1;S.top--;x=*S.top;return 1;
}
//取栈顶元素
Status get(SqStack &S,SElemType &x)
{if(S.top==S.base)return 1;x= *(S.top-1);return x;
}
//求长
int Stacklength(SqStack S){if(S.top==S.base)return 0;S.stacksize=S.top-S.base;return S.stacksize;
}
//打印
Status print(SqStack S){int len= Stacklength(S);int i;int e;for(i=1;i<=len;i++){e=*(S.top-i);printf("%5d",e);}return 1;
}
//主程序
int main(){SqStack S;Initstack(S);printf("输入若干正整数以0结束:");int x;scanf("%d",&x) ;while(x!=0) {Push(S,x);scanf("%d",&x); }int len,selem=0;selem=get(S,x) ;//取栈顶元素len= Stacklength(S);//求元素个数 printf("取栈顶元素:%d\n",selem);printf("栈中元素的个数是:%d\n",len); int i;printf("出栈结果:");for(i=0;i<len;i++) { Pop(S,x);printf("%4d",x); }printf("\n"); printf("栈中元素的个数是:%d\n",Stacklength(S));return 1;
}
10.运行图
栈的应用举例
1.数制转换
N = (N div d)×d + N mod d
void conversion () {InitStack(S); scanf ("%d",N);while (N) {Push(S, N % 8);N = N/8;}while (!StackEmpty(S)) {Pop(S,e);printf ( "%d", e );}
} // conversion
2.括号匹配的检验
假设在表达式中([]())或[([ ][ ])]等为正确的格式,[( ])或([( ))或 (()])
均为不正确的格式。
则检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。
例如:考虑下列括号序列:
[ ( [ ] [ ] ) ]
1 2 3 4 5 6 7 8
分析可能出现的不匹配的情况:
(1)到来的右括弧并非是所“期待”的;
(2)到来的是“不速之客”;
(3)直到结束,也没有到来所“期待”的括弧。
算法的设计思想:
1)凡出现左括弧,则进栈;
2)凡出现右括弧,首先检查栈是否空
若栈空,则表明该“右括弧”多余,
否则和栈顶元素比较,
若相匹配,则“左括弧出栈” ,
否则表明不匹配。
3)表达式检验结束时,
若栈空,则表明表达式中匹配正确,
否则表明“左括弧”有余。
Status matching(string& exp) {int state = 1;while (i<=Length(exp) && state) {switch of exp[i] {case 左括弧:{Push(S,exp[i]); i++; break;}case”)”: {if(NOT StackEmpty(S)&&GetTop(S)=“(“{Pop(S,e); ii++;}else {state = 0;}break; } … …}if (StackEmpty(S)&&state) return OK; …...
3.行编辑程序问题
在用户输入一行的过程中,允许用户输入出差错,并在发现有误时可以及时更正。
合理的作法是:
设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区,并假设“#”为退格符,“@”为退行符。
假设从终端接受了这样两行字符:
whli##ilr#e(s#*s)
outcha@putchar(*s=#++);
则实际有效的是下列两行:
while (*s)
putchar(*s++);
while (ch != EOF) { //EOF为全文结束符while (ch != EOF && ch != '\n') {switch (ch) {case '#' : Pop(S, c); break;case '@': ClearStack(S); break;// 重置S为空栈default : Push(S, ch); break; }ch = getchar(); // 从终端接收下一个字符}
将从栈底到栈顶的字符传送至调用过程的
数据区;
ClearStack(S); // 重置S为空栈
if (ch != EOF) ch = getchar();
4.迷宫求解
5.表达式求值
6.实现递归
数据结构《顺序栈》知识点详解+C语言完整代码-超详细相关推荐
- C语言实现数据结构之栈的详解
在函数调用的过程中,需要的就是先进后出的特点,因此,栈就出现了. 栈是一种数据结构,是计算机怎么处理程序运行的一种方式.具有先进后出的特点,下面看的就是这些抽象的数据结构怎么用C语言代码来实现,栈能实 ...
- 数据结构:栈「详解」
目录 一,栈的定义 二,栈的基本操作 1,顺序栈 1.1顺序栈的基本概念 1.2顺序栈的基本操作 2,链栈 2.1链栈的基本概念 2.2链栈的种类 2.3链栈的基本操作 三,栈的应用 1,函数递归调用 ...
- 数据结构期末复习知识点详解
第二章.线性表 1.线性表顺序存储结构和链式存储结构的特点 顺序存储时,相连数据元素的存放地址也相邻,逻辑与物理统一:内存中可用的存储单元都是连续的 优点:存储密度大,易于查找和修改 缺点:插入和删除 ...
- C语言实现扫雷完整算法详解~(附完整代码~)
扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...
- 基于MATLAB的拼图游戏设计(图文详解,附完整代码)
基于MATLAB的拼图游戏设计 内容摘要:MATL ...
- ECharts 数据各种图自适应 可视化 项目过程详解(附完整代码)
前言: 本篇文章的学习目的: 1.可视化面板布局适配屏幕 2.利用ECharts 实现柱状图展示 实现的技术栈: 基于 flexible.js +rem 智能大屏适配 VScode cssrem插件 ...
- 手撕yolo3系列——详解yolo3整体网络代码(详细注释)
完整代码百度云直达链接(包含预训练权重)(小白注释) https://pan.baidu.com/s/1US6e93OaCYOghmF21v0UIA 提取码:z8at 参考链接 [注]代码是大神的代码 ...
- 动态规划——矩阵连乘问题算法及实现详解(附完整代码)
问题分析 矩阵连乘问题是经典的动态规划问题,其主要是n个矩阵进行矩阵乘法运算时,通过括号改变运算的先后顺序,减少运算次数,找到最佳划分方法,求解最少运算次数. 算法分析 矩阵连乘问题中动态规划可以帮助 ...
- 【数据结构-树】3.详解二叉排序树(理论+代码)
二叉排序树 二叉排序树的定义 二叉排序树也称为二叉查找树.二叉排序树或者是一棵空树,或者是一棵具有如下特性的非空为茶树 若左子树非空,则左子树所有结点关键字值均小于根结点的关键字值 若右子树非空,则右 ...
最新文章
- R语言学习笔记-机器学习1-3章
- JavaScript 易错知识点整理
- 应用视觉设计_Day01
- 基于python的天气预报系统,基于python编写的天气抓取程序
- 查看mysql 默认端口号和修改端口号
- 信号量函数 semget() semop() semctl()
- 请问华为三层交换机里面的那个从IP是个什么意思? -
- Linux 命令之 locate -- 文件查找工具(查找文件/搜索文件)
- 全国计算机等级考试模拟系统中 二级c语言的 安装密码,NCRE模拟考试系统安卓版下载-2017全国计算机等级考试二级练习系统v2.4.1 官方版下载__飞翔下载...
- (二)第一个Servlet
- [转]Java 的强引用、弱引用、软引用、虚引用
- 全国30m精度土壤类型分布矢量数据、土壤理化性质数据集
- 解决方法:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
- python sorted怎么排序_Python sorted排序方法怎么用
- http代理IP的API接口要怎么使用
- 转载-Android 前沿UI
- C++小白如何入门?
- Delphi创建COM组件并分别用Delphi和html调用该组件的简单实例
- 格灵深瞳出手,灵异视频告破
- 以前写的代码感觉很有用