详解数据结构之顺序栈的基本操作(C语言描述)

2023-11-11

1.栈是线性表的特例,因此栈的顺序存储其实也就是线性表顺序存储的简化,我们称之为顺序栈,线性表是采用数组来实现的,因此顺序栈也采用数组来实现。
2.栈的结构定义:elementype类型根据实际情况而定,这里假设为int类型,栈的结构体定义为一个用来储存数据的数组和一个用来表示栈顶位置的栈顶指针,用typedef将整个结构体命名为myStack。
在这里插入图片描述
顺序栈中top的指示情况以及栈的各种操作时栈顶指针top的变化情况
在这里插入图片描述
3.初始化栈:将栈顶指针置为-1即可。
在这里插入图片描述
4.置空栈:与初始化栈一样,直接将栈顶指针置为-1即可。
在这里插入图片描述
5.入栈操作:先判断是否栈满,如果栈已经满了直接返回false(bool类型);如果栈没有满的话将栈顶指针加一,并把要入栈的元素赋值给栈顶空间,然后返回true。
在这里插入图片描述
6.出栈操作:先判断栈是否为空,如果是空栈的话向用户返回false,否则将要删除的元素赋值给临时变量e,然后将栈顶指针减一并返回true。
在这里插入图片描述
7.对栈中某个元素进行访问并打印:直接调用printf函数对元素进行打印即可。
在这里插入图片描述
8.遍历并将栈中所有元素进行打印(当然也可以对栈中元素进行其他操作),在for循环中调用访问函数。
在这里插入图片描述9.计算栈中元素的个数:因为栈顶指针为top,栈中元素的个数就是栈顶指针top加一之后的值。
在这里插入图片描述
10.获得栈顶元素的值:当栈为空时直接返回false,否则就将栈顶元素交给临时变量并返回临时变量的值即可,由于主函数中要得到临时变量的值,因此在传参的时候要将临时变量的地址传进去(即传递指针)
在这里插入图片描述11.整体代码及测试结果

#include<stdio.h>
#include<stdbool.h>					//bool(布尔类型的头文件) 
#include<string.h>
#define maxsize 20				//定义数组大小为20

typedef int elementype;		//int类型别名

typedef struct node{
	elementype data[maxsize];			//数据域 
	elementype top;						//栈顶指针 
}myStack;				

void visit(elementype c)			//访问栈中的元素 
{
	printf("%d ", c);
}

bool initstack(myStack *s)			//初始化栈 
{
	//这里没有给data申请空间建应该是因为数组的大小已经定义完成 
	s -> top = -1;	
	return true;
}

bool stackempty(myStack s)			//判断栈是否为空 
{
	if(s.top == -1)
		return true;
	else 
		return false;
} 

bool ClearStack(myStack *s) 		//将栈清空 
{ 
        s -> top = -1;
        return true;
}

elementype length(myStack s)		//计算栈中元素的个数 
{
	return s.top + 1;
}

bool getTop(myStack s, elementype *e)	//获得栈顶元素 
{
	if(s.top == -1)
		return false;
	else
		*e = s.data[s.top];
	return true;
}

bool push(myStack *s, elementype e)			//元素e入栈 
{
	if(s -> top == maxsize - 1)
		return false;
	else
	{
		s -> top++;				//栈顶指针加一 
		s -> data[s -> top] = e;		//新插入的元素进栈 
		return true;
	 } 
}

void traverse(myStack s)		//遍历栈中元素并进行打印 
{
	int i = 0;
	while(i <= s.top)			 
		visit(s.data[i++]);
	printf("\n");
} 

bool pop(myStack *s, elementype *e)		//栈顶元素出栈 
{
	if(s -> top == -1)
		return false;
	else
	{
		*e = s -> data[s -> top];
		s -> top--;			//栈顶指针减一 
		return true;
	}
}

int main()
{
	myStack s;				
	int j, e;
	if(initstack(&s) == 1)
	{
		for(j = 1;j <= 10;j++)
			push(&s, j);
	}
	puts("进栈之后的元素依次为: ");
	traverse(s);
	
	pop(&s, &e);
	printf("弹出的栈顶元素为 %d \n", e);
	printf("弹出栈顶元素之后的栈是否为空(1:空 0:否)%d\n", stackempty(s));
    getTop(s, &e);
    printf("栈顶元素 e=%d 栈的长度为%d\n", e, length(s));
	ClearStack(&s);
	printf("清空栈后,栈空否:%d(1:空 0:否)\n",stackempty(s));
	return 0;
}

测试结果代码在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解数据结构之顺序栈的基本操作(C语言描述) 的相关文章

  • Redis多数据中心复制管理系统—— X-Pipe

    Redis多数据中心复制管理系统 X Pipe Redis 在携程内部得到了广泛的使用 根据客户端数据统计 整个携程全部 Redis 的读写请求在每秒 200W 其中写请求约 10W 很多业务甚至会将 Redis 当成内存数据库使用 这样
  • 基于51单片机实现继电器控制照明设备(Proteus仿真)

    wechat 嵌入式工程师成长日记 具体功能实现 当按下开关时 继电器闭合点亮照明设备 灯泡 使用器件 照明设备 LAMP 按键 AT89C51 若干电阻 PNP晶体管 二极管 继电器 RTE24005F Proteus仿真原理图 仿真 知
  • C++字符串【string】和【char []】操作全攻略

    异想之旅 本人原创博客完全手敲 绝对非搬运 全网不可能有重复 本人无团队 仅为技术爱好者进行分享 所有内容不牵扯广告 本人所有文章仅在CSDN 掘金和个人博客 一定是异想之旅域名 发布 除此之外全部是盗文 一 char 类型 1 定义与输入
  • Linux_18.04 Failed to load module "canberra-gtk-module"

    解决办法 sudo apt install libcanberra gtk module
  • openGL之API学习(二十六)glTexImage2D

    给2维纹理分配显存空间 也可以从内存向显存拷贝数据 void glTexImage2D GLenum target GLint level GLint internalformat GLsizei width GLsizei height
  • 你需要知道的 Selenium4 新特性

    前言 最近又用到了Selneium 发现已经来到了 4 9 版本了 本篇文章来介绍下它较比 Selenium3 的一些新特性 记录下 当是做笔记了 最令人惊喜的是 Selenium4 会自动回收浏览器资源 本文所使用的 Selenium 版
  • linux常用命令及解释大全(一)

    目录 一 系统信息 二 关机 重启及登出 三 文件和目录 3 1 导航命令 3 2 查看命令 3 3 创建和删除命令 3 4 复制和链接命令 3 5 其他命令 四 文件搜索 五 挂载文件系统 六 磁盘空间 七 用户和群组 总结 前言 Lin
  • js 拦截alert对话框

  • 若依框架前后端分离版——导入功能

    引言 主要是记录自己使用若依框架并增加其导入功能的实现过程 前端部分 在相应的index vue中添加以下代码 1 数据导入的按钮 v hasPermi 是权限相关的配置
  • Git版本回退并提交远程

    1 进入远程git 在提交纪录中找到需要回退的版本 复制版本号 2 终端进入项目 并执行git reset hard 23a50a1fXXX41XXXXX0227 3 把修改推送至远程 执行已下指令 git push f u origin
  • thrift开发问题总结

    作为目前最流行的RPC框架 thrift不仅提供了通信协议 同时提供了网络框架 解脱了程序员的生产力 thrift也是阿帕奇Hadoop系列的RPC实现工具 本文主要聚焦在实现的thrift系统中 遇到的各种问题 但是thrift在隐藏一些
  • matlab 矩阵增加行,MATLAB 中 如何在矩阵中插入1行

    点击查看MATLAB 中 如何在矩阵中插入1行具体信息 答 举例来说吧假如你已有矩阵A如下 A 2 3 5 3 4 1 0 9 7 这是一个3 3矩阵 那么当你想插入一行r 1 2 3 时 那么可以这样做 A A r 这样A就变成了4 3的
  • Gin框架(学习笔记)

    目录 学习地址 gin 路由 routes group gin 中间件 Cookie 重定向 同步异步 日志文件 学习地址 https www topgoer com gin E6 A1 86 E6 9E B6 gin 路由 package
  • windows操作系统蓝屏错误对照表

    windows操作系统蓝屏错误对照表

随机推荐

  • 出行行业计价模块的设计模式实践

    业务场景介绍 在出行行业中 价格的配置随随着业务的增加而增加 而刺激出行的促销活动更是频繁 在价格的计算中 通常的流程如下 根据一组价格配置 计算订单基础的价格 根据用户拥有的优惠对象 例如优惠券 积分 会员级别等 计算出优惠以后的价格 计
  • 信号和槽机制

    1 信号和槽机制概念 信号 各种事件 槽 响应信号的动作 当某个事件发生后 如某个按钮被点击了一下 它就会发出一个被点击的信号 signal 某个对象接收到这个信号之后 就会做一些相关的处理动作 称为槽slot 但是Qt对象不会无故收到某个
  • pyqt5 一些界面色彩搭配的建议(RGB值)

    简约现代风格 底色 浅灰色 240 240 240 按钮控件颜色 中蓝色 0 122 255 文字框颜色 白色 255 255 255 字体颜色 深灰色 51 51 51 点击时的颜色 深蓝色 0 80 180 清新自然风格 底色 浅绿色
  • React中styled-components的使用(样式组件库)

    一 官网地址 https www styled components com 二 styled components 1 styled components 样式化组件 主要作用是它可以编写实际的CSS代码来设计组件样式 也不需要组件和样式
  • React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快

    一次性加载太多的路由文件会使首次加载的速度很慢 所以我们需要将路由搞成懒加载的形式 用到哪个组件加载哪个组件 庆幸的是React官方已经给我们准备好了插件 也在React库中 首先 从react这个库中导出lazy Suspense这两个方
  • mysql数据库的内部结构说明

    记住 表才是存放数据的基本单元 结论 Mysql数据底层由多个database组成 每一个database存放多张表
  • 【记录】在NAS上部署git文章汇总(网址)

    1 https blog csdn net mtclz3 article details 87461470 2 https blog csdn net u014213012 article details 65631261 3 https
  • git常用操作命令总结

    本篇文章主要收集记录git常用命令
  • Keil编程中Source Brower : "P17" is undefined!的问题

    博客原文 Keil编程中Source Brower P17 is undefined 的问题 在Keil新建工程中经常会遇到一个问题 去看某一个变量定义 然后跳转不过去 并提示Source Brower 某某 is undefined 在这
  • 嵌入式VSCode+gdbserver图形化调试环境搭建与使用

    目录 一 原理 二 环境搭建 1 VSCode设置 2 gdbserver安装 三 调试过程 一 原理 嵌入式系统中一般在 PC端运行 gdb工具 源码也是在 PC端 源码对应的可执行文件放到开发板中运行 为此我们需要在开发板中运行 gdb
  • 数据库分库分表

    一 为什么要分库分表 如果一个网站业务快速发展 那这个网站流量也会增加 数据的压力也会随之而来 比如电商系统来说双十一大促对订单数据压力很大 Tps十几万并发量 如果传统的架构 一主多从 主库容量肯定无法满足这么高的Tps 业务越来越大 单
  • Linux下Socket编程

    什么是Socket Socket接口是TCP IP网络的API Socket接口定义了许多函数或例程 程式员能够用他们来研发TCP IP网络上的应用程式 要学Internet上的TCP IP网络编程 必须理解Socket接口 Socket接
  • 七. Kubernetes Objects对象,对象状态与yaml

    目录 一 基础概念理解 二 k8s 对象中的spec与status 三 如何编写yaml 一 基础概念理解 Kubernetes Objects 官方地址 在k8s中所有操作资源实体都可以称为对象 先下图中的这些 都可以称为对象 不同对象功
  • 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)

    不同类型内中断的区分 中断类型码 8086cpu中在下面4种情况下会产生内中断 1 除法错误 如之前提到的除法溢出 2 单步执行 3 执行into指令 4 执行int指令 那么当内中断发生时cpu如何来区分到底是哪种中断源呢 通过中断类型码
  • 代码随想录训练营day9

    题目一 实现strStr 力扣题目链接 题目描述 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标 下标从 0 开始 如果 needle 不是 haysta
  • GLSL的in、out存储限制符使用错误

    在GLSL中用in修饰的变量表示传入的数据 用out修饰的变量表示传出的数据 通过这样可以实现顶点着色器向片段着色器传递数据 但要注意这个变量的命名要相同 不相同的话 片段着色器是获取不到从顶点着色器传入的数据的 1 顶点着色器 versi
  • unity打包技巧

    打包准备 1 android 需要jdk 和android sdk 如果有使用C 的库 还需要NDK 只有将 so文件放在 Assets Plugins Android libs下 Unity才会将 so文件识别为共享库 并在打包时将之拷贝
  • 分布式事务-seata AT模式-强一致性。

    目录 1 seata原理 2 关键组件 3 seate服务端参数 4 微服务配置 5 业务流程 6 依次启动eureka seate服务器 微服务 1 seata原理 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的
  • element-ui 表格一行显示多行内容并实现多行内某一行列合并

    这是加上边框的 去掉边框后这个表格看着更明显一点 表格一行放多行内容 并让第二行进行列合并 第一行不合并
  • 详解数据结构之顺序栈的基本操作(C语言描述)

    1 栈是线性表的特例 因此栈的顺序存储其实也就是线性表顺序存储的简化 我们称之为顺序栈 线性表是采用数组来实现的 因此顺序栈也采用数组来实现 2 栈的结构定义 elementype类型根据实际情况而定 这里假设为int类型 栈的结构体定义为