堆栈的抽象数据类型描述: 

 堆栈(Stack):具有一定操作约束的线性表

      1. 只在一端(栈顶,top)做插入、删除

  1. 插入数据:入栈(Push)
  2. 删除数据:出栈(Pop)
  3. 后进后出:Last In First Out (LIFO)

 类型名称:堆栈(Stack)

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

 操作集:长度为MaxSize的堆栈S € Stack,堆栈元素item € ElementType

  1. Stack CreateStack(int MaxSize):生成空堆栈,其最大长度为MaxSize;
  2. int IsFull(Stack S,int  MaxSize):判断堆栈S是否已满;
  3. void Push(Stack S,ElementType item):将元素item压入堆栈;
  4. int IsEmpty(Stack S):判断堆栈S是否为空;
  5. ElementType Pop(Stack  S):删除并返回栈顶元素;

栈的顺序存储实现:

  栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。

#define MaxSize /*存储数据元素的最大个数*/
typedef struct SNode *Stack;
struct SNode{ElementType Data[MaxSize];int Top;        //栈顶位置,即数组下标
};//1.入栈
void Push(Stack PtrS,ElementType item)
{if(PtrS->Top == MaxSize-1){printf(" 堆栈满 ");    return ;}else{PtrS-Data[++(PtrS->Top)] = item;return ;}
}//2.出栈
ElementType Pop(Stack PtrS)
{if(PtrS->Top == -1){printf(" 堆栈空 ");return ERROR;   /*ERROR是ElementType的特殊值,标志错误*/}elsereturn (PtrS->Data[(PtrS->Top)--]);
}

#define MaxSize     /*存储数据元素的最大个数*/
struct DStack{ElementType Data[MaxSize];int Top1;   /*堆栈1的栈顶指针*/int Top2;   /*堆栈2的栈顶指针*/
}S;
S.Top1 = -1;
S.Top2 = MaxSize;//入栈
void Push( struct DStack *PtrS,ElementType item,int Tag)
{/*Tag作为区分两个堆栈的标志,取值为1和2*/if( PtrS->Top2 - PtrS->Top1 == 1){  /*堆栈满*/printf("堆栈满");  return ;}if( Tag == 1)  /*对第一个堆栈操作*/PtrS->Data[++(PtrS->Top1)] = item;elsePtrS->Data[--(PtrS->Top2)] = item;
}//入栈
ElementType Pop( struct DStack *PtrS,int Tag)
{/*Tag作为区分两个堆栈的标志,取值为1和2 */if( Tag == 1){  /*对第一个堆栈操作*/if( PtrS->Top1 == -1){  /*堆栈1空*/printf(" 堆栈1空");    return NULL;}else {return PtrS->Data[(PtrS->Top1)--];}}else{if(PtrS->Top2 == MaxSize){  /*堆栈2空*/printf(" 堆栈2空 ");   return NULL;}else{return PtrS->Data[(PtrS->Top2)++];}}
}

堆栈的链式存储实现:

  栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行。栈顶指针Top应该在链表头部。

typedef struct SNode *Stack;
struct SNode{ElementType Data;struct SNode *Next;
};//(1)堆栈初始化(建立空栈)
//(2)判断堆栈S是否为空//创建堆栈头结点
Stack CreateStack()
{/*构建一个堆栈的头结点,返回指针*/Stack S;S = (Stack)malloc(sizeof(struct SNode));S->Next = NULL;return S;
}//判断堆栈是否为空
int IsEmpty(Stack S)
{/*判断堆栈S是否为空,若为空函数返回整数1,否则返回0*/return ( S->Next == NULL);
}//入栈
void Push(ElementType item,Stack S)
{/*将元素item压入堆栈S*/struct SNode *TmpCell;TmpCell = (struct SNode *)malloc(sizeof(struct SNode));TmpCell->Element = item;TmpCell->Next = S->Next;S->Next = TmpCell;
}//判断数组满不满
ElementType Pop(Stack S)
{/*删除并返回堆栈s的栈顶元素*/struct SNode *FirstCell;ElementType TopElem;if( IsEmpty( S )){printf("堆栈空");  return NULL;}else{FirstCell = S->Next;S->Next = FirstCell->Next;TopElem = FirstCell->Element;free(FirstCell);return TopElem;}
}

转载于:https://www.cnblogs.com/King-boy/p/10506086.html

堆栈用数组和用链表实现相关推荐

  1. 【Java8】堆栈/队列/数组/链表/红黑树,List/set子接口,hashcode/hashset,Map/内部接口,/统计字符个数,debug,斗地主,Collections,TreeSet

    文章目录 1.堆栈/队列/数组/链表:数据结构即计算机组织管理数据的方式,堆栈指的是内存图中的栈,不是堆 2.红黑树:二查,二查平,二查平1倍 3.List子接口:集合,IndexOutOfBound ...

  2. Java实现有序数组和无序数组_【算法】字典的诞生:有序数组 PK 无序链表

    参考资料 <算法(java)>                           - - Robert Sedgewick, Kevin Wayne <数据结构>       ...

  3. 链表节点合并排序:数组和单链表

    每日一贴,今天的内容关键字为链表节点 1 数组合并排序 1.1 合并两个已排序好的数组 需要额定的存储空间用来存储合并结果 //merge two array which are already so ...

  4. Java数据结构和算法:数组、单链表、双链表

    1. 概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的 ...

  5. 数组模拟单链表acwing826. 单链表

    文章目录 单链表一道题 数组模拟单链表模板 初始化链表 向表头插入数 在下标为k的节点的下一个位置插入节点 删除下标为k的节点的下一个节点 单链表一道题 单链表题目 实现一个单链表,链表初始为空,支持 ...

  6. C++ 静态链表(用数组模拟动态链表)

    描述 主题:链表 功能:用数组模拟动态链表,分别实链表的插入.删除操作 提示:如果需要进入下一步操作,输入错误范围(如:0)即可 第一个元素的cur用于存放备用链表的第一个元素的下标 最后一个元素的c ...

  7. 数据结构——数组、单向链表、双向链表

    原文:http://www.cnblogs.com/skywang12345/p/3561803.html 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性 ...

  8. Java将一个堆栈进行反转,如何使用Java中的堆栈反转数组的元素?

    堆栈是一种抽象数据类型(ADT),通常在大多数编程语言中使用.它被称为堆栈,因为它的行为类似于现实世界中的堆栈,例如,一副纸牌或一堆盘子等. 堆栈是先进先出的,它具有两个主要操作push和pop.Pu ...

  9. 队列,栈,堆栈,数组,链表特点与区别

    1. 队列可以看成是有2个口的集合一个口叫队头一个叫队尾,只能在对头进行删除操作,在队尾做插入.根据这样的操作.队列特点是先进先出 2.堆栈可以看成是有1个口的集合,这个口叫栈顶.插入和删除操作只能在 ...

最新文章

  1. 【Java Web开发指南】解析Spring中Ioc和DI(入门Demo)
  2. 将数组绑定到dropdownlist上
  3. 源码阅读 AtomicInteger
  4. python 单例模式的四种实现方法
  5. phppython混合开发_如何让python嵌入html实现类似php的快速开发,十分有价值
  6. MySQL数据库服务器搭建及基本管理
  7. 使用Angular4手把手构建符合企业实际的项目管理系统----【npm】工具的使用
  8. 小程序影藏溢出的gif_动图制作方法,1分钟教会你如何制作gif表情包!
  9. android 模拟器 锁屏,锁屏桌面全模拟 Android 4.0伪装教程
  10. 迅捷OCR文字识别软件的功能介绍
  11. 【NOIP2013提高组day1】货车运输
  12. 照片变漫画的方法有哪些?推荐两个方法给你
  13. 硬件:宽带猫(光猫)的基础知识
  14. iOS 友盟登录和分享
  15. 引路蜂技术博客论坛开放
  16. 从P1到P7——我在淘宝这7年转载
  17. 微信小程序:全局状态变量的使用
  18. 计算机维修进度安排表,教学进度表实验安排表考勤成绩册计算机网络技术教学进度表(计09本).doc...
  19. matlab中的lsqcurvefit 拟合
  20. 电路理论部分重点(1)

热门文章

  1. sikuli python java_从命令行运行sikulix 1.1.4 python脚本
  2. 为什么python如此火爆_Python为何如此火爆?
  3. pygame重新开始_Pygame(十八)音乐
  4. public class c中_Spring中@Import的各种用法以及ImportAware接口
  5. springboot旅游系统设计技术描述_5A旅游景区标识标牌系统业材料的工艺技术
  6. matlab fft2 opencv,基于OPENCV的FFT2变换
  7. Ubuntu安装jupyter,启动出现ModuleNotFoundError: No module named ‘pysqlite2‘ 错误
  8. wordpress创建_如何创建WordPress儿童主题
  9. angularjs教程_AngularJS活动教程
  10. 三元运算符和if else_PHP If-Else,Switch Case和速记三元运算符示例