一、堆栈简介

对于需要管理的队列,主要操作是在序列的末尾插入和取出(删除)元素,有这样操作要求的序列我们称之为堆栈(Stack)。

堆栈可以认为是具有一定约束的线性表,插入和删除都作用在一个称为栈顶(Top)的位置。日常生活中和也可以看到堆栈的例子,例如对厨房中叠放的盘子来说,使用盘子(删除操作)时从顶端拿走盘子,用完放回(插入操作)时也是放到顶端。

通常把数据插入称为压入栈(Push),数据取出(删除)叫做弹出栈(Pop)。正是由于最后入栈的元素最先弹出这一特性,堆栈也被称为后入先出(Last In First Out, LIFO)表。

二、堆栈的抽象数据类型定义及基本操作

  1. typedef struct SNode* PtrToSNode;
  2. struct SNode
  3. {
  4. int* Data;//存放堆栈元素的数组
  5. int Top;//记录栈顶位置
  6. int MaxSize;//记录堆栈长度
  7. };

类型名称:堆栈(Stack)。

数据对象集:一个有0个或多个元素的有穷线性表。

操作集:对于一个具体长度为正整数MaxSize的堆栈S来说,对堆栈中的任一元素X来说,有以下操作:

1、PtrToSNode Create(int max):创建一个最大容量为max的空堆栈

  1. PtrToSNode Create(int max)
  2. {
  3. PtrToSNode s = (PtrToSNode)malloc(sizeof(struct SNode));//开辟堆栈所需要的空间
  4. s->Data = (int*)malloc(max * sizeof(int));//开辟存储堆栈数据的数组所需要的空间
  5. s->Top = -1;//Top记录当前栈顶元素的下标值,置为-1,说明栈为空
  6. s->MaxSize = max;//堆栈的最大容量
  7. return s;
  8. }

2、bool IsFull(PtrToSNode s):判断堆栈是否已满

  1. bool IsFull(PtrToSNode s)
  2. {
  3. return (s->Top == s->MaxSize - 1);
  4. }

3、bool Push(PtrToSNode s, int num):入栈

  1. bool Push(PtrToSNode s, int num)
  2. {
  3. if (! IsFull(s))
  4. {
  5. s->Top++;
  6. s->Data[s->Top] = num;
  7. return true;
  8. }
  9. else
  10. {
  11. printf("栈已满!");
  12. system("pause");
  13. return false;
  14. }
  15. }

4、bool IsEmpty(PtrToSNode s):判断堆栈是否空

  1. bool IsEmpty(PtrToSNode s)
  2. {
  3. return (s->Top == -1);
  4. }

5、int Pop(PtrToSNode s):出栈

  1. int Pop(PtrToSNode s)
  2. {
  3. if (!IsEmpty(s))
  4. {
  5. int num = s->Data[s->Top];
  6. s->Top--;
  7. return num;
  8. }
  9. else
  10. {
  11. printf("堆栈空!");
  12. system("pause");
  13. return -1;
  14. }
  15. }

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. Jenkins通过git tags进行回滚代码

    配置Jenkins获取git tag代码的方式其实方法很多,目前我使用比较多的主要是通过Git Parameter 来配置动态的获取最新tags代码,主要我们首先需要安装一下Git Parameter ...

  2. 获取Shell脚本当前的目录

    https://qiushao.net/article/1489983836453?p=1&m=0 SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE[0]}); ...

  3. Spring Boot 整合Quartz定时器

    概述 项目需要定时器的调度管理,原来使用Spring Boot自带的定时器,但是不能后台动态的操作暂停.启动以及新增任务等操作,维护起来相对麻烦:最近研究了Quartz的框架,觉得还算不错,整理了一下 ...

  4. JS ArrayBuffer和String

    http://blog.mn886.net/chenjianhua/show/6b02fa4173ed/index.html ArrayBuffer和String 互相转换 function str2 ...

  5. python 10大算法之二 LogisticRegression 笔记

    使用的包 import matplotlib.pyplot as plt import pandas as pd import numpy as npfrom sklearn import datas ...

  6. 按键精灵PC版<末日王者>

    更新模式[强制] 更新版本[1.28] 更新链接[https://yunfei-1256035889.cos.ap-beijing.myqcloud.com/%E6%9C%AB%E6%97%A5%E4 ...

  7. AAC编码学习

    AAC音频编码 https://www.jianshu.com/p/af0165f923e9 https://blog.csdn.net/u013427969/article/details/5309 ...

  8. Alpha冲刺(1/10)——2019.4.23

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  9. centos6.5使用LVM

    1.添加硬盘 centos6以前的版本用kudzu来不重启识别新硬件. [root@xen01 ~]# /etc/init.d/kudzu start -bash: /etc/init.d/kudzu ...

  10. 使用snap

    snap是一个Linux上的包管理器,其目的是提供跨平台的包管理 提到包管理我们会想到python的 pip conda等,以及 apt等等 snap提供了一个 统一的体验在各种Linux发行版上 关 ...