栈
来源:互联网 发布:windows 10 蓝屏重启 编辑:程序博客网 时间:2024/05/20 20:03
栈的抽象数据类型
ADT Stack{ 数据对象:D={ai|ai属于ElemSet,i=1.2...,n,n>=0} 数据关系:R1={<a(i-1),ai>|a(i-1),ai属于D,i=2,...,n} 约定an端为栈顶,a1端为栈顶。 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 DestroyStack(&S) 初始条件:栈S已存在。 操作结果:栈S被销毁。 ClearStack(&S) 初始条件:栈S已存在。 操作结果:将S清为空栈。 StackEmpty(S) 初始条件:栈S已存在。 操作结果:若栈S为空栈,则返回TRUE,否则FALSE。 StackLength(S) 初始条件:栈S已存在。 操作结果:返回S的元素个数,即栈的长度。 GetTop(S,&e) 初始条件:栈S已存在且非空。 操作结果:用e返回S的栈顶元素。 Push(&S,e) 初始条件:栈S已存在。 操作结果:插入元素e为新的栈顶元素,并用e为新的栈顶元素。 Pop(&S,&e) 初始条件:栈S已存在。 操作结果:删除S的栈顶元素,并用e返回其值。 StackTraverse(S,visit()) 初始条件:栈S已存在且非空。 操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。}ADT Stack## 栈的表示和实现 ## typedef struct{ SElemType *base; SElemType *top; int stacksize; //栈的当前可使用的最大容量 }SqStack; //===ADT Stack的表示与实现==== //----栈的顺序存储表示----- #define STACK_INIT_SIZE 100; //存贮空间初始分配量 #define STACKINCREMENT 10; //存储空间分配增量 typedef struct{ SElemType *base; //在栈构造之前和摧毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储容量,以元素为单位 }SqStack; //---基本操作的函数原型说明------ Status InitStack(SqStack &S); //构造一个空栈S Status DestroyStack(SqStack &S);//销毁栈S,S不再存在 Status ClearStack(SqStack &S); //把S置为空栈 Status StackEmpty(SqStack S); //若栈为空栈,则返回TREE,否则返回FALSE int StackLength(SqStack S); //返回S的元素个数,即栈的长度 Status GetTop(SqStack S,SElemType &e); //若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR Status Push(SqStack &S,SElemType e); //插入元素e为新的栈顶元素 Status Pop(SqStack &S,SElemType &e); //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR Status StackTraverse(SqStack S,Status(*visit)()); //从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败,则操作失败 //---基本操作的算法描述(部分)-----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;}//InitStackStatus GetTop(SqStack S,SElemType &e){ //若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR if(S.top==S.base) return ERROR; e=*(S.top-1); return OK;}//GetTopStatus 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;}//PushStatus Pop(SqStack &S,SElemType &e){ //若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR if(S.top==S.base)return ERROR; e=*--S.top; return OK;}//Pop
0 0
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- 栈
- Python_操作txt、xls、csv、PDF
- 跨文档操作
- (一)java多线程之Thread
- 多重部分和问题-DP动态规划
- Nachos操作系统:Pro1_5:实现优先级调度
- 栈
- 常见的几种RuntimeException
- CCFlow开源工作流SDK流程开发模式简单教程
- Android中android:layout_weight属性解决不同机型平均分布的适配问题
- Linux根目录下各个系统文件夹的含义和用途
- make menuconfig提示'make menuconfig' requires the ncurses libraries解决方法
- MyBatis动态SQL设置
- HDU2553
- (二)java多线程之synchronized