C 基于数组存储的堆栈实现
一、堆栈简介
对于需要管理的队列,主要操作是在序列的末尾插入和取出(删除)元素,有这样操作要求的序列我们称之为堆栈(Stack)。
堆栈可以认为是具有一定约束的线性表,插入和删除都作用在一个称为栈顶(Top)的位置。日常生活中和也可以看到堆栈的例子,例如对厨房中叠放的盘子来说,使用盘子(删除操作)时从顶端拿走盘子,用完放回(插入操作)时也是放到顶端。
通常把数据插入称为压入栈(Push),数据取出(删除)叫做弹出栈(Pop)。正是由于最后入栈的元素最先弹出这一特性,堆栈也被称为后入先出(Last In First Out, LIFO)表。
二、堆栈的抽象数据类型定义及基本操作
typedef struct SNode* PtrToSNode;
struct SNode
{
int* Data;//存放堆栈元素的数组
int Top;//记录栈顶位置
int MaxSize;//记录堆栈长度
};
类型名称:堆栈(Stack)。
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:对于一个具体长度为正整数MaxSize的堆栈S来说,对堆栈中的任一元素X来说,有以下操作:
1、PtrToSNode Create(int max):创建一个最大容量为max的空堆栈
PtrToSNode Create(int max)
{
PtrToSNode s = (PtrToSNode)malloc(sizeof(struct SNode));//开辟堆栈所需要的空间
s->Data = (int*)malloc(max * sizeof(int));//开辟存储堆栈数据的数组所需要的空间
s->Top = -1;//Top记录当前栈顶元素的下标值,置为-1,说明栈为空
s->MaxSize = max;//堆栈的最大容量
return s;
}
2、bool IsFull(PtrToSNode s):判断堆栈是否已满
bool IsFull(PtrToSNode s)
{
return (s->Top == s->MaxSize - 1);
}
3、bool Push(PtrToSNode s, int num):入栈
bool Push(PtrToSNode s, int num)
{
if (! IsFull(s))
{
s->Top++;
s->Data[s->Top] = num;
return true;
}
else
{
printf("栈已满!");
system("pause");
return false;
}
}
4、bool IsEmpty(PtrToSNode s):判断堆栈是否空
bool IsEmpty(PtrToSNode s)
{
return (s->Top == -1);
}
5、int Pop(PtrToSNode s):出栈
int Pop(PtrToSNode s)
{
if (!IsEmpty(s))
{
int num = s->Data[s->Top];
s->Top--;
return num;
}
else
{
printf("堆栈空!");
system("pause");
return -1;
}
}
C 基于数组存储的堆栈实现的更多相关文章
- 教你如何使用Java手写一个基于数组实现的队列
一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...
- 实现基于Memcache存储的Session类
自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 使用基于文件的Session存取瓶颈可能都是在 ...
- java中存储机制堆栈。
一.java的六种存储地址及解释 1) 寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不 ...
- 基于数组的shell脚本编写
基于数组的shell脚本编写 2017年08月17日 22:56:36 momokuku123 阅读数:369 数据:变量,文件,数组 变量:存储单个元素的内存中的一块存储空间 数组:存储多个元素的内 ...
- sql server数据库如何存储数组,int[]float[]double[]数组存储到数据库方法
原文地址:https://www.zhaimaojun.top/Note/5475296 将数组存储到数据库的方法 (本人平时同csharp编写代码,所以本文中代码都是csharp代码,有些地方jav ...
- 基于数组或链表的学生信息管理系统(小学期C语言程序实训)
1.基于数组的学生信息管理系统 实验内容: 编写并调试程序,实现学校各专业班级学生信息的管理.定义学生信息的结构体类型,包括:学号.姓名.专业.班级.3门成绩. 实验要求: (1) main函数:以菜 ...
- 基于本地存储的kvm虚拟机在线迁移
基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...
- 实现基于文件存储的Session类
自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...
- 基于visual Studio2013解决算法导论之023队列实现(基于数组)
题目 基于数组的队列 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #i ...
随机推荐
- linux extglob模式 和rm反选
前言 extglob模式开启之后Shell可以另外识别出5个模式匹配操作符,能使文件匹配更加方便. 不然不识别! 正文 #开启命令: shopt -s extglob #关闭命令: shopt -u ...
- WPF使用第三方字体(TTF字体)
1.下载第三方字体文件,将以TTF结尾的文件复制到项目中 2.在App.xaml中或者你需要的地方添加资源的定义 <Application.Resources> <FontFamil ...
- coding基本功实践
作为一名程序员,除了需要具备解决问题的思路以外,代码的质量和简洁性也很关键.因为从一个人的代码可以直接看出你的基本功.对于Python而言,这就意味着你需要对Python的内置功能和库有很深入的了解. ...
- RabbitMQ 保证消息不丢失
参考:https://www.imooc.com/article/49814 发送消息的时候,加上messageId字段,数据库记录消息日志表 ,插入的时候为发送中 当收到消息的时候,更改为已发送 , ...
- POSIX Timer
SYNOPSIS #include <signal.h> /* only timer_create need this header */ #include <time.h> ...
- gcd前缀和-蒜头君的数轴
题目: 今天蒜头君拿到了一个数轴,上边有 n个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同. 蒜头君想知道,他最少需 ...
- myBase Desktop 6.5.1 无限期试用
清空安装目录下的"nyfedit.ini"文件的"App.UserLic.FirstUseOn="配置项的值
- CentOS7安装及简单配置(一)
CentOS7是RHEL的社区版,摘抄维基百科的一段话如下: CentOS(Community Enterprise Operating System)是Linux发行版之一,它是来自于Red Hat ...
- 用clumsy模拟丢包测试socket库的失败重传
用python的socket库写了通信小程序,现在我需要通过软件模拟出在网络极差的情况下,socket底层解决丢包问题的能力怎么样,我一开始想的是分别在linux和windowns下分别测试,后来一想 ...
- Spark内部执行机制
Spark内部执行机制 1.1 内部执行流程 如下图1为分布式集群上spark应用程序的一般执行框架.主要由sparkcontext(spark上下文).cluster manager(资源管理器)和 ...