《大话数据结构》读书笔记之栈抽象数据类型(链表实现)
2014-09-13 19:45
239 查看
/*
Name: 栈抽象数据类型(使用链表实现)
Copyright:
Author: 巧若拙
Date:13-09-14 19:02
Description:
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status; //函数类型,其值是函数结果状态代码,如OK等
typedef struct StackNode{
ElemType data;//数据域
struct StackNode *next;//直接后继指针
} StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top;//栈顶指针
int count;//栈元素个数
} LinkStack;
Status InitStack(LinkStack *L);//建立一个空的栈S
Status StackEmpty(LinkStack L);//若栈为空,返回TRUE,否则返回FALSE
Status ClearStack(LinkStack *L);//将栈清空
int StackLength(LinkStack L);//返回栈S的元素个数
Status DisplayStack(LinkStack L);//输出栈S的所有元素
Status GetTop(LinkStack L, ElemType *e);//用e返回栈S的栈顶元素
Status LocateElem(LinkStack L, ElemType e);//在栈S中查找是否存在与给定值e相等的元素
Status Push(LinkStack *L, ElemType e);//在栈S中插入新元素e
Status Pop(LinkStack *L, ElemType *e);//删除栈S的栈顶元素,并将该元素值赋给e
int main(void)
{
LinkStack a;
ElemType *p, e = 0;
int i;
InitStack(&a);//建立一个空的栈
for (i=0; i<MAXSIZE; i++)
{
Push(&a, i+1);//在栈S中插入新元素e
}
DisplayStack(a);
for (i=1; i<StackLength(a); i+=2)
{
Pop(&a, &e);//删除栈S的栈顶元素,并将该元素值赋给e
}
printf("e = %d\n", e);
DisplayStack(a);
e = 50;
if (LocateElem(a, e))//在栈S中查找是否存在与给定值e相等的元素
{
printf("存在%d\n", e);
}
else
{
printf("不存在%d\n", e);
Push(&a, e);//在栈S中插入新元素e
}
DisplayStack(a);
ClearStack(&a);//将栈清空
DisplayStack(a);
return 0;
}
/*
函数功能:建立一个空的栈S
初始条件:无
操作结果:初始化栈S。操作成功返回OK,否则返回ERROR
*/
Status InitStack(LinkStack *S)
{
S->top = NULL;
S->count = 0;
return OK;
}
/*
函数功能:判断栈是否为空
初始条件:链栈S已经存在
操作结果:若栈为空,返回TRUE,否则返回FALSE
*/
Status StackEmpty(LinkStack S)
{
return (S.top == NULL) ? TRUE : FALSE;
}
/*
函数功能:将栈清空
初始条件:链栈S已经存在
操作结果:将栈清空。操作成功返回OK,否则返回ERROR
*/
Status ClearStack(LinkStack *S)
{
LinkStackPtr p;
if (S == NULL)
{
return ERROR;
}
while (S->top)
{
p = S->top;
S->top = p->next;
free(p);
}
S->count = 0;
return OK;
}
/*
函数功能:返回栈S的元素个数
初始条件:链栈S已经存在
操作结果:返回栈S的元素个数
*/
int StackLength(LinkStack S)
{
return S.count;
}
/*
函数功能:输出栈S的所有元素
初始条件:链栈S已经存在
操作结果:输出栈S的所有元素。操作成功返回OK,否则返回ERROR
*/
Status DisplayStack(LinkStack S)
{
int i = 0;
LinkStackPtr p = S.top;
if (S.top == NULL)
{
printf("none!\n");
return ERROR;
}
while (p)
{
printf("data[%d] = %d, ", i++, p->data);
p = p->next;
}
printf("\n");
return OK;
}
/*
函数功能:用e返回栈S的栈顶元素
初始条件:链栈S已经存在
操作结果:用e返回栈S的栈顶元素。操作成功返回OK,否则返回ERROR
*/
Status GetTop(LinkStack S, ElemType *e)
{
if (S.top == NULL)
{
return ERROR;
}
*e = S.top->data;
return OK;
}
/*
函数功能:在栈S中查找是否存在与给定值e相等的元素
初始条件:链栈S已经存在
操作结果:在栈S中查找是否存在与给定值e相等的元素。找到返回TRUE,否则返回FALSE
*/
Status LocateElem(LinkStack S, ElemType e)
{
LinkStackPtr p = S.top;
while (p)
{
if (p->data == e)
{
return TRUE;
}
p = p->next;
}
return FALSE;
}
/*
函数功能:在栈S中插入新元素e
初始条件:链栈S已经存在
操作结果:在栈S中插入新元素e。操作成功返回OK,否则返回ERROR
*/
Status Push(LinkStack *S, ElemType e)
{
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
if (!p)
{
printf("Out of space!");
return ERROR;
}
p->data = e;
p->next = S->top;
S->top = p;
S->count++;
return OK;
}
/*
函数功能:删除栈S的栈顶元素,并将该元素值赋给e
初始条件:链栈S已经存在
操作结果:删除栈S的栈顶元素,并将该元素值赋给e。
操作成功返回OK,否则返回ERROR
*/
Status Pop(LinkStack *S, ElemType *e)
{
LinkStackPtr p = S->top;
if (S->top == NULL)
{
return ERROR;
}
*e = S->top->data;
S->top = S->top->next;
free(p);
S->count--;
return OK;
}
Name: 栈抽象数据类型(使用链表实现)
Copyright:
Author: 巧若拙
Date:13-09-14 19:02
Description:
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status; //函数类型,其值是函数结果状态代码,如OK等
typedef struct StackNode{
ElemType data;//数据域
struct StackNode *next;//直接后继指针
} StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top;//栈顶指针
int count;//栈元素个数
} LinkStack;
Status InitStack(LinkStack *L);//建立一个空的栈S
Status StackEmpty(LinkStack L);//若栈为空,返回TRUE,否则返回FALSE
Status ClearStack(LinkStack *L);//将栈清空
int StackLength(LinkStack L);//返回栈S的元素个数
Status DisplayStack(LinkStack L);//输出栈S的所有元素
Status GetTop(LinkStack L, ElemType *e);//用e返回栈S的栈顶元素
Status LocateElem(LinkStack L, ElemType e);//在栈S中查找是否存在与给定值e相等的元素
Status Push(LinkStack *L, ElemType e);//在栈S中插入新元素e
Status Pop(LinkStack *L, ElemType *e);//删除栈S的栈顶元素,并将该元素值赋给e
int main(void)
{
LinkStack a;
ElemType *p, e = 0;
int i;
InitStack(&a);//建立一个空的栈
for (i=0; i<MAXSIZE; i++)
{
Push(&a, i+1);//在栈S中插入新元素e
}
DisplayStack(a);
for (i=1; i<StackLength(a); i+=2)
{
Pop(&a, &e);//删除栈S的栈顶元素,并将该元素值赋给e
}
printf("e = %d\n", e);
DisplayStack(a);
e = 50;
if (LocateElem(a, e))//在栈S中查找是否存在与给定值e相等的元素
{
printf("存在%d\n", e);
}
else
{
printf("不存在%d\n", e);
Push(&a, e);//在栈S中插入新元素e
}
DisplayStack(a);
ClearStack(&a);//将栈清空
DisplayStack(a);
return 0;
}
/*
函数功能:建立一个空的栈S
初始条件:无
操作结果:初始化栈S。操作成功返回OK,否则返回ERROR
*/
Status InitStack(LinkStack *S)
{
S->top = NULL;
S->count = 0;
return OK;
}
/*
函数功能:判断栈是否为空
初始条件:链栈S已经存在
操作结果:若栈为空,返回TRUE,否则返回FALSE
*/
Status StackEmpty(LinkStack S)
{
return (S.top == NULL) ? TRUE : FALSE;
}
/*
函数功能:将栈清空
初始条件:链栈S已经存在
操作结果:将栈清空。操作成功返回OK,否则返回ERROR
*/
Status ClearStack(LinkStack *S)
{
LinkStackPtr p;
if (S == NULL)
{
return ERROR;
}
while (S->top)
{
p = S->top;
S->top = p->next;
free(p);
}
S->count = 0;
return OK;
}
/*
函数功能:返回栈S的元素个数
初始条件:链栈S已经存在
操作结果:返回栈S的元素个数
*/
int StackLength(LinkStack S)
{
return S.count;
}
/*
函数功能:输出栈S的所有元素
初始条件:链栈S已经存在
操作结果:输出栈S的所有元素。操作成功返回OK,否则返回ERROR
*/
Status DisplayStack(LinkStack S)
{
int i = 0;
LinkStackPtr p = S.top;
if (S.top == NULL)
{
printf("none!\n");
return ERROR;
}
while (p)
{
printf("data[%d] = %d, ", i++, p->data);
p = p->next;
}
printf("\n");
return OK;
}
/*
函数功能:用e返回栈S的栈顶元素
初始条件:链栈S已经存在
操作结果:用e返回栈S的栈顶元素。操作成功返回OK,否则返回ERROR
*/
Status GetTop(LinkStack S, ElemType *e)
{
if (S.top == NULL)
{
return ERROR;
}
*e = S.top->data;
return OK;
}
/*
函数功能:在栈S中查找是否存在与给定值e相等的元素
初始条件:链栈S已经存在
操作结果:在栈S中查找是否存在与给定值e相等的元素。找到返回TRUE,否则返回FALSE
*/
Status LocateElem(LinkStack S, ElemType e)
{
LinkStackPtr p = S.top;
while (p)
{
if (p->data == e)
{
return TRUE;
}
p = p->next;
}
return FALSE;
}
/*
函数功能:在栈S中插入新元素e
初始条件:链栈S已经存在
操作结果:在栈S中插入新元素e。操作成功返回OK,否则返回ERROR
*/
Status Push(LinkStack *S, ElemType e)
{
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
if (!p)
{
printf("Out of space!");
return ERROR;
}
p->data = e;
p->next = S->top;
S->top = p;
S->count++;
return OK;
}
/*
函数功能:删除栈S的栈顶元素,并将该元素值赋给e
初始条件:链栈S已经存在
操作结果:删除栈S的栈顶元素,并将该元素值赋给e。
操作成功返回OK,否则返回ERROR
*/
Status Pop(LinkStack *S, ElemType *e)
{
LinkStackPtr p = S->top;
if (S->top == NULL)
{
return ERROR;
}
*e = S->top->data;
S->top = S->top->next;
free(p);
S->count--;
return OK;
}
相关文章推荐
- 《大话数据结构》读书笔记之栈抽象数据类型(数组实现)
- 《大话数据结构》读书笔记之线性表抽象数据类型(双向循环链表实现)
- 《大话数据结构》读书笔记之 队列抽象数据类型(数组实现循环队列)
- 有序链表实现集合的抽象数据类型
- 《大话数据结构》读书笔记之线性表基本操作(静态单链表实现)
- 大话数据结构之php实现单链表
- 大话数据结构(二)——线性表链式存储结构(单链表)的java实现
- 大话数据结构(三)——单向循环链表的java实现
- 数据结构 严蔚敏 清华大学出版社 第二章 抽象数据类型 链表的实现 成功编译并运行
- 第3章 线性表的单链表c#实现---《大话数据结构》读书笔记
- 《数据结构与算法》学习笔记14 用链表实现抽象数据类型
- 大话数据结构(八)Java程序——双向链表的实现 线性链表——双向链表
- 链表的C语言实现之动态内存分配
- 用链表实现学生信息管理(请教探讨!)
- 链表的C语言实现(五)
- 链表的C语言实现之动态内存分配(转载)
- 链表的C语言实现(范例)
- c实现的一个经典链表
- 双链表实现大整数的加法与乘法[VC++]
- 链表的c语言实现(六)