`

栈的顺序存储表示

阅读更多
 /* c3-1.h 栈的顺序存储表示 */
 #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
 #define STACKINCREMENT 2 /* 存储空间分配增量 */
 typedef struct SqStack
 {
   SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
   SElemType *top; /* 栈顶指针 */
   int stacksize; /* 当前已分配的存储空间,以元素为单位 */
 }SqStack; /* 顺序栈 */

 

 /* bo3-1.c 顺序栈(存储结构由c3-1.h定义)的基本操作(9个) */
 Status InitStack(SqStack *S)
 { /* 构造一个空栈S */
   (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
   if(!(*S).base)
     exit(OVERFLOW); /* 存储分配失败 */
   (*S).top=(*S).base;
   (*S).stacksize=STACK_INIT_SIZE;
   return OK;
 }

 Status DestroyStack(SqStack *S)
 { /* 销毁栈S,S不再存在 */
   free((*S).base);
   (*S).base=NULL;
   (*S).top=NULL;
   (*S).stacksize=0;
   return OK;
 }

 Status ClearStack(SqStack *S)
 { /* 把S置为空栈 */
   (*S).top=(*S).base;
   return OK;
 }

 Status StackEmpty(SqStack S)
 { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
   if(S.top==S.base)
     return TRUE;
   else
     return FALSE;
 }

 int StackLength(SqStack S)
 { /* 返回S的元素个数,即栈的长度 */
   return S.top-S.base;
 }

 Status GetTop(SqStack S,SElemType *e)
 { /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
   if(S.top>S.base)
   {
     *e=*(S.top-1);
     return OK;
   }
   else
     return ERROR;
 }

 Status Push(SqStack *S,SElemType e)
 { /* 插入元素e为新的栈顶元素 */
   if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */
   {
     (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
     if(!(*S).base)
       exit(OVERFLOW); /* 存储分配失败 */
     (*S).top=(*S).base+(*S).stacksize;
     (*S).stacksize+=STACKINCREMENT;
   }
   *((*S).top)++=e;
   return OK;
 }

 Status Pop(SqStack *S,SElemType *e)
 { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
   if((*S).top==(*S).base)
     return ERROR;
   *e=*--(*S).top;
   return OK;
 }

 Status StackTraverse(SqStack S,Status(*visit)(SElemType))
 { /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。 */
   /* 一旦visit()失败,则操作失败 */
   while(S.top>S.base)
     visit(*S.base++);
   printf("\n");
   return OK;
 }

 

 /* main3-1.c 检验bo3-1.cpp的主程序 */
 #include"c1.h"
 typedef int SElemType; /* 定义栈元素类型,此句要在c3-1.h的前面 */
 #include"c3-1.h"
 #include"bo3-1.c"

 Status visit(SElemType c)
 {
   printf("%d ",c);
   return OK;
 }

 void main()
 {
   int j;
   SqStack s;
   SElemType e;
   if(InitStack(&s)==OK)
     for(j=1;j<=12;j++)
       Push(&s,j);
   printf("栈中元素依次为:");
   StackTraverse(s,visit);
   Pop(&s,&e);
   printf("弹出的栈顶元素 e=%d\n",e);
   printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
   GetTop(s,&e);
   printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
   ClearStack(&s);
   printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
   DestroyStack(&s);
   printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
 }

 

分享到:
评论

相关推荐

    数据结构-栈的顺序存储

    数据结构-栈的顺序存储

    栈顺序存储

    一个较为完整的栈顺序存储,包含了很多函数及基础算法。main可运行测试。

    栈的顺序存储表示与实现实验源代码.rar

    栈的顺序存储表示与实现实验源代码.rar

    栈的顺序和链式存储的表示和实现.docx

    掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现。实验内容:栈的顺序表示和实现编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能。初始化顺序栈插入一个元素删除栈顶...

    栈和队列的顺序存储结构和链式存储结构停车场问题

    车辆按到达先后顺序依次从最里面向大门口停放 。 如果已放满 N 辆车 , 再来的车辆只能在大门外的便道上等待 , 一旦有车辆从停车场离开排在便道上的车辆可依次进入停车场 。停车场中某辆车离开时 , 在它之后进入...

    数据结构之栈(顺序结构实现)

    数据结构中的重要基本的顺序存储表示,另外还有链式结构的实现方式,我会陆续上传

    数据结构 主要是栈 含有课件 练习

    2. 栈的顺序存储表示表示和实现 (1)顺序栈动态分配存储空间方法 和对栈操作设计 (2)顺序栈静态分配存储空间方法 和对栈操作设计 * 3. 栈的链式存储结构——链栈 顺序栈静态分配存储空间方法 和对栈操作设计

    数据结构 严蔚敏 代码

    范例1-105 无向图的邻接多重表存储表示 344 ∷相关函数:CreateGraph函数 1.7.5 最小生成树 355 范例1-106 最小生成树 355 ∷相关函数:MiniSpanTree_PRIM函数 1.7.6 关节点和重连通分量 359 范例1-107 关节点和重...

    c++顺序栈的实现demo

    在C++中,顺序栈的实现通常涉及一个类,该类包含一个数组来存储栈中的元素,以及一个表示栈顶位置的整数。以下是一个简单的顺序栈实现的示例说明: 首先,我们定义一个顺序栈类SequentialStack,并在其构造函数中...

    c语言-通过使用数据结构来实现顺序栈的使用

    顺序栈中的元素按照入栈的顺序存储在数组中,并且通过一个指针来记录栈顶的位置。栈顶位置的初始值为-1,表示栈为空。 顺序栈的基本操作包括入栈(push)、出栈(pop)、获取栈顶元素(peek)和判断栈是否为空(is_...

    顺序栈、链栈将10进制转为2、8、16进制源码

    采用C++语言实现利用顺序栈、链栈将10进制数转为2、8、16进制数。 通过本编程实例,可以进一步了解到顺序栈和链栈之间区别和联系,体会两者的异同,进一步加深知识印象,是不错的练习素材哦。

    基于Python顺序栈的实现

    这个顺序栈的实现中,data 是一个数组,用于存储栈中的元素;top 是一个整数,表示栈顶元素在数组中的索引;max_size 是栈的最大容量。 is_empty 方法用于判断栈是否为空,如果栈顶指针 top 为 -1,则栈为空。 is_...

    考研数据结构代码.pdf

    目录 线性表 一、顺序存储 1.顺序存储的静态分配 2.顺序存储的动态分配 3.顺序存储线性表的插入 4.顺序存储线性表的删除 二、链式存储 5.链式存储线性表的结构 6.头插法建立单链表 7.尾插法建立单链表 8.链式存储按...

    数据结构习题答案(全部算法)严蔚敏版

    3.1.2 栈的顺序存储结构(向量) 3.1.3 栈的链表存储结构 3.1.4 栈的应用 3.2 队列 3.2.1 队列的定义及运算 3.2.2 队列的顺序存储结构(向量) 3.2.3 队列的链表存储结构 3.3 栈和队列的算法实现举例 习题...

    数据结构 线性表 顺序表基本操作

    线性表的顺序表的建立、插入、删除、输出等操作。

    数据结构操作题.doc

    给出三元组线性表的顺序存储表示。 【解答】 树 6. 按照下列给定二叉树的先序遍历序列和中序遍历序列,构造出二叉树。 先序遍历序列:EBADCFHGIKJ 中序遍历系列:ABCDEFGHIJK。 7. 对给定的权值{2,3,4,7,8,9...

    数据结构中栈和队列思想的停车场管理系统

    需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。

    数据结构的基本概念和术语抽象数据类型的表示与实现算法及算法设计要求第四课:算法效率的度量和存储空间需求

    第一课:数据结构的基本概念和术语 第二课:抽象数据类型的表示与实现 ...第七课:实验一 线性表的顺序存储实验 第八课:线性表的链式表示与实现 第九课:循环链表与双向链表 第十课:栈的表示与实现

    栈的操作(实验报告).doc

    熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在 栈的顺序存储结构和链式存储结构上的实现; 2. 熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基本 操作...

    数据结构 栈、队列应用 C++

    5. 栈的应用2(可使用顺序栈或链栈完成):实现中缀表达式计算器,提示将表达式后缀表示并存储于一个数组中,再完成该后缀表达式运算 测试:5*3+(2-4/6)的后缀,其余测试自已设置 6. 递归及应用1:使用递归顺序...

Global site tag (gtag.js) - Google Analytics