`

栈的顺序存储表示

阅读更多
 /* 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);
 }

 

分享到:
评论

相关推荐

    数据结构-栈的顺序存储

    在这个主题中,我们将深入探讨一种特殊的数据结构——栈(Stack),特别是它的顺序存储实现方式。栈是一种后进先出(Last In, First Out,简称LIFO)的数据结构,常被比喻为一叠盘子,新加入的盘子总是在最上面,要...

    栈的顺序存储结构C实现

    本文将详细介绍如何使用顺序存储结构来实现栈,并根据所给标题和描述,讨论相关的C语言实现细节。 首先,我们来看栈的顺序存储结构。在顺序栈中,元素被存储在一块连续的内存区域中,就像一个数组。这种存储方式...

    栈_顺序存储c代码

    在本示例中,“栈_顺序存储c代码”实现了这种数据结构在C语言中的具体应用。 顺序存储的栈通常使用数组来实现,因为数组可以提供连续的内存空间,方便进行元素的插入和删除操作。下面我们将深入探讨这个C代码实现的...

    《数据结构》--栈的顺序存储和链式存储

    在这个主题中,我们将专注于两种重要的数据结构实现:栈的顺序存储和链式存储。栈是一种特殊的数据结构,被称为“后进先出”(LIFO)结构,这意味着最后进入的元素将首先被取出。这种特性使得栈在许多算法和程序设计...

    栈顺序存储

    在“栈顺序存储”这个主题中,主要涉及以下几个知识点: 1. **栈的基本操作**:栈的基本操作包括初始化、入栈(push)、出栈(pop)、查看栈顶元素(top)和判断栈是否为空(isEmpty)。这些操作在给定的代码中应该...

    栈的顺序存储结构

    栈的顺序存储结构是计算机科学中数据结构的一种实现方式,主要应用于处理需要后进先出(LIFO,Last In First Out)操作的问题。在本文中,我们探讨的是使用C++模板类来实现栈的顺序存储,这个实现适用于哈工大的软件...

    栈的顺序存储

    ### 栈的顺序存储 #### 一、概念与特点 栈是一种特殊的线性表,它只允许在一端进行插入和删除操作,这一端被称为栈顶(Top),另一端则称为栈底(Bottom)。栈遵循“后进先出”(Last In First Out, LIFO)的原则...

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

    本实验源代码主要涉及栈的顺序存储表示及其实现。 顺序存储的栈通常使用数组来实现。数组的一端作为栈顶,当有元素入栈或出栈时,操作均在这个端点进行。下面是关于栈的顺序存储和实现的一些关键知识点: 1. **...

    顺序栈的表示和实现源码

    在顺序栈中,元素存储在一块连续的内存区域中,通过数组或动态数组来实现。顺序栈的操作通常包括初始化、判断栈是否为空、获取栈顶元素、进栈(压栈)、出栈(弹栈)以及销毁栈等。下面我们将详细讨论这些知识点。 ...

    栈的顺序存储结构顺序栈.pdf

    顺序栈是一种顺序存储结构,它是运算受限的顺序表。顺序栈的存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针 top 指示栈顶元素在顺序栈中的位置。 顺序栈的类型定义类似于顺序...

    栈的顺序存储结构顺序栈.docx

    栈的顺序存储结构顺序栈 栈的顺序存储结构简称顺序栈,是一种运算受限的顺序表。顺序栈的存储结构是:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针 top 指示栈顶元素在顺序栈中的位置...

    栈的顺序与链式存储结构与操作

    顺序存储结构通过数组来表示栈。数组的一个固定位置作为栈顶,栈的操作仅发生在栈顶。 **类定义** ```cpp class SeStack { public: void Get(); // 获取栈顶元素 void Clear(); // 清空栈 void Empty(); // 判断...

    顺序存储 栈的一些操作

    本篇文章将深入探讨栈的顺序存储方式及其在C语言中的实现,旨在帮助你理解和掌握相关知识。 栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO,Last In First Out)原则。在栈中,最新加入的元素(称为栈顶元素...

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

    【栈的顺序存储结构与链式存储结构】 栈是一种具有特殊性质的线性表,它遵循“后进先出”(LIFO)的原则。在顺序存储结构中,栈的元素在内存中是连续存放的,通常使用数组来实现。而在链式存储结构中,每个元素...

    顺序栈实现括号配对

    顺序栈是一种特殊的栈结构,它可以按照顺序存储和检索元素。在本例中,我们可以使用顺序栈来存储括号,并判断括号之间的匹配关系。 首先,我们需要定义一个顺序栈的数据结构,包括栈的底层结构和栈的操作接口。在本...

    作业 第三章 栈和队列 顺序存储结构和链式存储结构

    本章主要探讨的是两种常用且基础的数据结构——栈(Stack)和队列(Queue),以及它们的两种基本存储方式:顺序存储结构(Sequential Storage Structure)和链式存储结构(Linked Storage Structure)。我们将深入...

    数据结构---栈和队列之顺序栈(C语言)

    1. 初始化:创建一个空的顺序栈,需要分配一个数组并设置栈顶指针为-1,表示栈为空。 2. 入栈(Push):检查当前栈是否已满,如果没有满,则将新元素添加到栈顶,并更新栈顶指针。 3. 出栈(Pop):检查当前栈是否为...

Global site tag (gtag.js) - Google Analytics