bo3-1-1.c 链栈(存储结构由c2-2.h定义)的基本操作(4个) 及验证
2012-11-06 20:39
555 查看
/* bo3-5.c 链栈(存储结构由c2-2.h定义)的基本操作(4个) */
/* 部分基本操作是由bo2-8.cpp中的函数改名得来 */
/* 另一部分基本操作是由调用bo2-8.cpp中的函数(取特例)得来 */
typedef SElemType ElemType; /* 栈结点类型和链表结点类型一致 */
#include"c2-2.h" /* 单链表存储结构 */
typedef LinkList LinkStack; /* LinkStack是指向栈结点的指针类型 */
#define InitStack InitList /* InitStack()与InitList()作用相同,下同 */
#define DestroyStack DestroyList
#define ClearStack ClearList
#define StackEmpty ListEmpty
#define StackLength ListLength
#include"bo2-8.c" /* 无头结点单链表的基本操作 */
Status GetTop(LinkStack S,SElemType *e)
{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
return GetElem(S,1,e);
}
Status Push(LinkStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
return ListInsert(S,1,e);
}
Status Pop(LinkStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
return ListDelete(S,1,e);
}
void StackTraverse(LinkStack S,void(*visit)(SElemType))
{ /* 从栈底到栈顶依次对栈中每个元素调用函数visit() */
LinkStack temp,p=S; /* p指向栈顶元素 */
InitStack(&temp); /* 初始化临时栈temp */
while(p)
{
Push(&temp,p->data); /* 由S栈顶到栈底,依次将栈元素入栈到temp栈 */
p=p->next;
}
ListTraverse(temp,visit); /* 遍历temp线性表 */
}
/* main3-5.c 检验bo3-5.c的主程序 */
#include"c1.h"
typedef int SElemType; /* 定义栈元素的类型 */
#include"bo3-5.c"
void print(SElemType c)
{
printf("%d ",c);
}
int main()
{
int j;
LinkStack s;
SElemType e;
InitStack(&s); /* 初始化栈s */
for(j=1;j<=5;j++) /* 将2,4,6,8,10入栈 */
Push(&s,2*j);
printf("栈中的元素从栈底到栈顶依次为: ");
StackTraverse(s,print);
Pop(&s,&e);
printf("弹出的栈顶元素为%d\n",e);
printf("栈空否: %d(1:空 0:否)\n",StackEmpty(s));
GetTop(s,&e);
printf("当前栈顶元素为%d,栈的长度为%d\n",e,StackLength(s));
ClearStack(&s);
printf("清空栈后,栈空否: %d(1:空 0:否),栈的长度为%d\n",StackEmpty(s),StackLength(s));
DestroyStack(&s);
}
/* 部分基本操作是由bo2-8.cpp中的函数改名得来 */
/* 另一部分基本操作是由调用bo2-8.cpp中的函数(取特例)得来 */
typedef SElemType ElemType; /* 栈结点类型和链表结点类型一致 */
#include"c2-2.h" /* 单链表存储结构 */
typedef LinkList LinkStack; /* LinkStack是指向栈结点的指针类型 */
#define InitStack InitList /* InitStack()与InitList()作用相同,下同 */
#define DestroyStack DestroyList
#define ClearStack ClearList
#define StackEmpty ListEmpty
#define StackLength ListLength
#include"bo2-8.c" /* 无头结点单链表的基本操作 */
Status GetTop(LinkStack S,SElemType *e)
{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
return GetElem(S,1,e);
}
Status Push(LinkStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
return ListInsert(S,1,e);
}
Status Pop(LinkStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
return ListDelete(S,1,e);
}
void StackTraverse(LinkStack S,void(*visit)(SElemType))
{ /* 从栈底到栈顶依次对栈中每个元素调用函数visit() */
LinkStack temp,p=S; /* p指向栈顶元素 */
InitStack(&temp); /* 初始化临时栈temp */
while(p)
{
Push(&temp,p->data); /* 由S栈顶到栈底,依次将栈元素入栈到temp栈 */
p=p->next;
}
ListTraverse(temp,visit); /* 遍历temp线性表 */
}
/* main3-5.c 检验bo3-5.c的主程序 */
#include"c1.h"
typedef int SElemType; /* 定义栈元素的类型 */
#include"bo3-5.c"
void print(SElemType c)
{
printf("%d ",c);
}
int main()
{
int j;
LinkStack s;
SElemType e;
InitStack(&s); /* 初始化栈s */
for(j=1;j<=5;j++) /* 将2,4,6,8,10入栈 */
Push(&s,2*j);
printf("栈中的元素从栈底到栈顶依次为: ");
StackTraverse(s,print);
Pop(&s,&e);
printf("弹出的栈顶元素为%d\n",e);
printf("栈空否: %d(1:空 0:否)\n",StackEmpty(s));
GetTop(s,&e);
printf("当前栈顶元素为%d,栈的长度为%d\n",e,StackLength(s));
ClearStack(&s);
printf("清空栈后,栈空否: %d(1:空 0:否),栈的长度为%d\n",StackEmpty(s),StackLength(s));
DestroyStack(&s);
}
相关文章推荐
- bo2-2.cpp 带有头结点的单链表(存储结构由c2-2.h定义)的基本操作(12个)
- bo2-4.cpp设立尾指针的单循环链表(存储结构由c2-2.h定义)的12个基本操作
- bo3-4.c 用单链表的基本操作实现链队列(存储结构由c3-2.h定义)的基本操作(9个)
- bo2-8.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(9个)
- bo2-9.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(2个)
- bo2-5.cpp 带头结点的双向循环链表(存储结构由c2-4.h定义)的基本操作(14个)
- bo2-6.cpp 具有实用意义的线性链表(存储结构由c2-5.h定义)的24个基本操作
- bo2-7.cpp 多项式(存储结构由c2-6.h定义)的基本操作及算法
- bo2-1.cpp 顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个)
- 3.1.2顺序栈(存储结构由c3-1.h定义)的基本操作
- 数据结构_图_定义/分类/顶点与边之间的关系/连通图/存储结构/基本操作
- 数据结构中栈的链式结构—链栈的基本操作
- 数据结构(二)链表1:链式存储的基本操作
- 存储过程的定义和基本操作!
- bo2-31.cpp 一个数组只生成一个静态链表(数据结构由c2-3.h定义)的基本操作(11个))
- 线性表链式存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、归并等)
- 串采用堆分配存储结构的基本操作
- bo2-32.cpp 一个数组可生成若干静态链表(数据结构由c2-3.h定义)的基本操作(12个)
- 图的邻接矩阵存储结构基本操作的实现
- 以邻接矩阵作为存储结构实现图的创建与基本操作