数据结构基础之栈的顺序存储表示与实现

   一、栈的定义

  栈是限定仅在表尾进行插入或删除操作的线性表。

  栈的表尾称为栈顶,表头称为栈底,不含元素的空表称为空栈。

  栈的抽象数据类型定义:

  ADT Stack{

  数据对象:D={ai|ai(- ElemSet,i=1,2,...,n,n>=0}

  数据关系:R1={|ai-1,ai(- D,i=2,...,n}

  基本操作:

  InitStack(&S) 构造一个空栈S

  DestroyStack(&S) 栈S存在则栈S被销毁

  ClearStack(&S) 栈S存在则清为空栈

  StackEmpty(S) 栈S存在则返回TRUE,否则FALSE

  StackLength(S) 栈S存在则返回S的元素个数,即栈的长度

  GetTop(S,&e) 栈S存在且非空则返回S的栈顶元素

  Push(&S,e) 栈S存在则插入元素e为新的栈顶元素

  Pop(&S,&e) 栈S存在且非空则删除S的栈顶元素并用e返回其值

  StackTraverse(S,visit())栈S存在且非空则从栈底到栈顶依次对S的每个数据元素调用函数visit()一旦visit()失败,则操作失败

  }ADT Stack

  二、栈的表示和实现

  栈的存储方式:

  1、顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置

  2、链栈:利用链表实现

  顺序栈的类C语言定义:

  typedef struct{

  SElemType *base;

  SElemType *top; //设栈顶栈底两指针的目的是便于判断栈是否为空

  int StackSize; //栈的当前可使用的最大容量.

  }SqStack;

  顺序栈的的模块说明:

  struct STACK {

  SElemType *base;

  SElemType *top;

  int stacksize;

  };

  typedef struct STACK Sqstack;

  Status InitStack(SqStack &S);

  Status DestroyStack(SqStack &S);

  Status ClearStack(SqStack &S);

  Status StackEmpty(SqStack S);

  int StackLength(SqStack S);

  Status GetTop(SqStack S,SElemType &e);

  Status Push(SqStack &S,SElemType e);

  Status Pop(SqStack &S,SElemType &e);

  Status StackTraverse(SqStack S,Status (*visit)());

  Status InitStack(SqStack &S) {

  S.base=(SelemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType));

  if(!S.base)exit(OVERFLOW);

  S.top=S.base;

  S.stacksize=STACK_INI_SIZE;

  return OK;

  }//IniStack

  Status DestroyStack(SqStack &S); {

  }//DestroyStack

  Status ClearStack(SqStack &S); {

  S.top=S.base;

  } //ClearStack

  Status StackEmpty(SqStack S); {

  if(S.top==S.base) return TRUE;

  else return FALSE;

  } //StackEmpty

  int StackLength(SqStack S); {

  int i; SElemType *p;

  i=0;

  p=S.top;

  while(p!=S.base) {p++; i++; }

  } //stackLength

  Status GetTop(SqStack S,SElemType &e); {

  if(S.top==S.base) return ERROR;

  e=*(S.top-1);

  return OK;

  } //GetTop

  Status Push(SqStack &S,SElemType e); {

  if(S.top - s.base>=S.stacksize) {

  S.base=(ElemType *) realloc(S.base,

  (S.stacksize + STACKINCREMENT) * sizeof(ElemType));

  if(!S.base)exit(OVERFLOW);

  S.top=S.base+S.stacksize;

  S.stacksize+=STACKINCREMENT;

  }

  *S.top++=e;

  return OK;

  } //Push

  Status Pop(SqStack &S,SElemType &e); {

  if(S.top==S.base)

  return ERROR;

  e=*--S.top;

  return OK;

  }//Pop

  Status StackTraverse(SqStack S,Status (*visit)()); {

  }//StackTraverse

  以上伪代码的C语言源码

  三、总结

  栈的定义

  栈的顺序存储实现

时间: 2024-09-26 13:26:32

数据结构基础之栈的顺序存储表示与实现的相关文章

数据结构的C++实现之栈的顺序存储结构

栈(stack)是限定在表尾进行插入和删除操作的线性表.我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构.   示例程序:(改编自<大话数据结构>) #include <iostream> using namespace std; #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[

“数据结构基础”系列网络课程主页

前言 自从下决心要解决学生动手能力差的问题,开始了课程实践资源的建设之旅:自迷上了翻转课堂,所教课程的视频,也就逐渐形成了体系.在为我自己的校内学生服务的同时,也希望能够让更多人有机会用到. 自全身心投入教学,收入.奖金的渠道也便收缩到了极致.接受CSDN学院商业运作的规则,将课程投放此处,一则创收一些,弥补付出数倍精力建设资源而只能喝大锅饭中稀粥中的不平衡,二则因免费带来的不珍惜也让自己有些不快.课程定价大概等值于一张景区门票,或者一块生日蛋糕,愿者自行决定. 为天下IT学子服务的诺言不变,为

数据结构实践项目——栈

本组项目针对<数据结构基础系列(3):栈和队列>中的1-6课: 1 "栈和队列"导学 2 栈的定义 3 栈的顺序存储结构及其基本运算实现 4 栈的链式存储结构及其基本运算的实现 5 栈的应用1-表达式求值 6 栈的应用2-迷宫问题 [项目1 - 建立顺序栈算法库] 定义顺序栈存储结构,实现其基本运算,并完成测试. 要求: 1.头文件sqstack.h中定义数据结构并声明用于完成基本运算的函数.对应基本运算的函数包括: void InitStack(SqStack *&

c++-C++ PAT数据结构基础02-1题 反转单链表

问题描述 C++ PAT数据结构基础02-1题 反转单链表 题目大意:反转单链表,给定常数K和单链表L,要求按每K个节点反转单链表,如:L: 1->2->3->4->5->6 K=3,输出:3->2->1->6->5->4,如果K=4,输出:4->3->2->1->5->6. 输入说明:每次输入一个案例,对每个案例,第一行内容是链表第一个节点的地址,节点数N(N<=100,000)(不一定是最终形成的单链表的节

最好是mytc做-数据结构里关于栈的操作

问题描述 数据结构里关于栈的操作 1.采用链式存储实现栈的初始化.入栈.出栈操作. 2. 结构体部分代码: typedef struct node { int data; struct node *next; }StackNode,*LinkStack; //定义栈结构 LinkStack Init_LinkStack() { return NULL; } //初始化 函数(a): LinkStack Push_LinkStack(LinkStack top,int x)//入栈 {-} 函数(

c#-数据结构关于双向栈的问题

问题描述 数据结构关于双向栈的问题 我自己做的小程序 是一个停车管理系统 我把相关的数据结构的定义和函数的定义发下 求大家帮忙看看,是不是我定义的有问题,运行出现问题,大概是在进栈出栈上出现的问题,谢谢大家啦~~ typedef struct ds_Car //地上停车场车辆 { int number; //车号 int hour; //到达的小时 int minute; //到达的分钟 }ds_CarNode; typedef struct //地上停车场(采用双向栈) { ds_CarNod

数据结构基础 伸展树

问题描述 数据结构基础 伸展树 为什么我自己画出来的展开的树和书上的不一样呢,是哪步旋转错了么? 解决方案 数据结构 - 树(基础)数据结构基础(3)-------------树第六章数据结构基础之树部分 解决方案二: 图看不清,谁知道你问的啥.

c++数据结构快速排序用栈实现

问题描述 c++数据结构快速排序用栈实现 已知快速排序的部分代码如下,勿改动,请利用栈实现快速排序非递归函数:void QuickSort(); //quickSort #include using namespace std; const int MaxSize=100; class List { private: int r[MaxSize+1]; int n; public: List(){n=0;} //empty list void InsertR(int k) //表尾插入 { r[

数据结构实验之栈一:进制转换

数据结构实验之栈一:进制转换 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. Input 第一行输入需要转换的十进制数: 第二行输入R. Output 输出转换所得的R进制数. Example Input 1279 8 Example Output 2377 Code realization #include <stdio.h> #in