顺序栈

    • 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语言完整代码-超详细相关推荐

  1. C语言实现数据结构之栈的详解

    在函数调用的过程中,需要的就是先进后出的特点,因此,栈就出现了. 栈是一种数据结构,是计算机怎么处理程序运行的一种方式.具有先进后出的特点,下面看的就是这些抽象的数据结构怎么用C语言代码来实现,栈能实 ...

  2. 数据结构:栈「详解」

    目录 一,栈的定义 二,栈的基本操作 1,顺序栈 1.1顺序栈的基本概念 1.2顺序栈的基本操作 2,链栈 2.1链栈的基本概念 2.2链栈的种类 2.3链栈的基本操作 三,栈的应用 1,函数递归调用 ...

  3. 数据结构期末复习知识点详解

    第二章.线性表 1.线性表顺序存储结构和链式存储结构的特点 顺序存储时,相连数据元素的存放地址也相邻,逻辑与物理统一:内存中可用的存储单元都是连续的 优点:存储密度大,易于查找和修改 缺点:插入和删除 ...

  4. C语言实现扫雷完整算法详解~(附完整代码~)

    扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...

  5. 基于MATLAB的拼图游戏设计(图文详解,附完整代码)

                                                                               基于MATLAB的拼图游戏设计 内容摘要:MATL ...

  6. ECharts 数据各种图自适应 可视化 项目过程详解(附完整代码)

    前言: 本篇文章的学习目的: 1.可视化面板布局适配屏幕 2.利用ECharts 实现柱状图展示 实现的技术栈: 基于 flexible.js +rem 智能大屏适配 VScode cssrem插件 ...

  7. 手撕yolo3系列——详解yolo3整体网络代码(详细注释)

    完整代码百度云直达链接(包含预训练权重)(小白注释) https://pan.baidu.com/s/1US6e93OaCYOghmF21v0UIA 提取码:z8at 参考链接 [注]代码是大神的代码 ...

  8. 动态规划——矩阵连乘问题算法及实现详解(附完整代码)

    问题分析 矩阵连乘问题是经典的动态规划问题,其主要是n个矩阵进行矩阵乘法运算时,通过括号改变运算的先后顺序,减少运算次数,找到最佳划分方法,求解最少运算次数. 算法分析 矩阵连乘问题中动态规划可以帮助 ...

  9. 【数据结构-树】3.详解二叉排序树(理论+代码)

    二叉排序树 二叉排序树的定义 二叉排序树也称为二叉查找树.二叉排序树或者是一棵空树,或者是一棵具有如下特性的非空为茶树 若左子树非空,则左子树所有结点关键字值均小于根结点的关键字值 若右子树非空,则右 ...

最新文章

  1. R语言学习笔记-机器学习1-3章
  2. JavaScript 易错知识点整理
  3. 应用视觉设计_Day01
  4. 基于python的天气预报系统,基于python编写的天气抓取程序
  5. 查看mysql 默认端口号和修改端口号
  6. 信号量函数 semget() semop() semctl()
  7. 请问华为三层交换机里面的那个从IP是个什么意思? -
  8. Linux 命令之 locate -- 文件查找工具(查找文件/搜索文件)
  9. 全国计算机等级考试模拟系统中 二级c语言的 安装密码,NCRE模拟考试系统安卓版下载-2017全国计算机等级考试二级练习系统v2.4.1 官方版下载__飞翔下载...
  10. (二)第一个Servlet
  11. [转]Java 的强引用、弱引用、软引用、虚引用
  12. 全国30m精度土壤类型分布矢量数据、土壤理化性质数据集
  13. 解决方法:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
  14. python sorted怎么排序_Python sorted排序方法怎么用
  15. http代理IP的API接口要怎么使用
  16. 转载-Android 前沿UI
  17. C++小白如何入门?
  18. Delphi创建COM组件并分别用Delphi和html调用该组件的简单实例
  19. 格灵深瞳出手,灵异视频告破
  20. 以前写的代码感觉很有用

热门文章

  1. J-Link 安装和配置
  2. Linux-SO_REUSEPORT特性
  3. Linux 安装Oracle10g
  4. Liquibase学习4 - 管理changelog
  5. 20.创新与企业家精神——结论,企业家社会
  6. Python中获取两数相除的商和余数
  7. linux 安装swig
  8. k8s调试工具--busybox
  9. MySQL面试题——聚簇索引和非聚簇索引
  10. 在list中插入一个数据