一、堆栈简介

对于需要管理的队列,主要操作是在序列的末尾插入和取出(删除)元素,有这样操作要求的序列我们称之为堆栈(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 基于数组存储的堆栈实现的更多相关文章

  1. 教你如何使用Java手写一个基于数组实现的队列

    一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...

  2. 实现基于Memcache存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 使用基于文件的Session存取瓶颈可能都是在 ...

  3. java中存储机制堆栈。

    一.java的六种存储地址及解释 1) 寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不 ...

  4. 基于数组的shell脚本编写

    基于数组的shell脚本编写 2017年08月17日 22:56:36 momokuku123 阅读数:369 数据:变量,文件,数组 变量:存储单个元素的内存中的一块存储空间 数组:存储多个元素的内 ...

  5. sql server数据库如何存储数组,int[]float[]double[]数组存储到数据库方法

    原文地址:https://www.zhaimaojun.top/Note/5475296 将数组存储到数据库的方法 (本人平时同csharp编写代码,所以本文中代码都是csharp代码,有些地方jav ...

  6. 基于数组或链表的学生信息管理系统(小学期C语言程序实训)

    1.基于数组的学生信息管理系统 实验内容: 编写并调试程序,实现学校各专业班级学生信息的管理.定义学生信息的结构体类型,包括:学号.姓名.专业.班级.3门成绩. 实验要求: (1) main函数:以菜 ...

  7. 基于本地存储的kvm虚拟机在线迁移

    基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...

  8. 实现基于文件存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...

  9. 基于visual Studio2013解决算法导论之023队列实现(基于数组)

     题目 基于数组的队列 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #i ...

随机推荐

  1. python 对Excel表格的写入

    python对Excel表格写入需要导入xlrd ,和xlutils两个库 from xlrd import open_workbook from xlutils.copy import copy o ...

  2. 2-4、配置Filebeat使用logstash

    配置filebeat使用logstash 重要:要将事件发送到Logstash,还需要创建一个Logstash配置管道,该管道监听传入的Beats连接并将收到的事件编入索引到Elasticsearch ...

  3. BFC知识点概括与总结

    什么是BFC?如何生成一个BFC?BFC有什么作用? 一:什么是BFC? 首先了解CSS中两个概念:box和formatting context. Box:CSS布局中的基本单位.一个页面由多个box ...

  4. C++中的const总结

    CONST 一.符号常量 声明: const 类型说明符 常量名 = 常量值: const float PI = 3.1415927; //可以交换const与float的位置 符号常量在声明时一定要 ...

  5. Echarts折线图案例

    公司要求做个累计收益图,没用过Echarts,再这里记录一下 html页面 <!DOCTYPE html> <html> <head> <meta chars ...

  6. Linux下system()函数的实现

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types. ...

  7. nginx学习.第一部分

    1.nginx的版本发布历史 2015年支持thread pool提供stream四层反向代理支持reuseport特性,支持http v2协议.完全可以替代LVS 2016年支持动态模块 2.ngi ...

  8. 腾讯AI开放平台的使用

    一.腾讯AI开放平台 https://ai.qq.com/ 二.腾讯AI平台支持的功能 三.签名机制 1.计算步骤 用于计算签名的参数在不同接口之间会有差异,但算法过程固定如下4个步骤. 1.将< ...

  9. java基础之IO流及递归理解

    一.IO流(简单理解是input/output流,数据流内存到磁盘或者从磁盘到内存等) 二.File类(就是操作文件和文件夹的) 1.FIleFile类构造方法 注意:通过构造方法创建的file对象是 ...

  10. Qwt 编译 配置 使用

    QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类, ...