栈的动态链表的实现
来源:互联网 发布:cn丅v中国网络电视台 编辑:程序博客网 时间:2024/04/30 06:11
/***
*ElemType.cpp - ElemType的实现
*
****/
#include <stdio.h>
#include "ElemType.h"
int compare(ElemType x, ElemType y)
{
return(x-y);
}
void visit(ElemType e)
{
printf("%d/n", e);
}
============================================
/***
*DynaSeqStack.h - 动态顺序栈的定义
*
****/
#if !defined(DYNASEQSTACK_H)
#define DYNASEQSTACK_H
#include "ElemType.h"
/*------------------------------------------------------------
// 栈结构的定义
------------------------------------------------------------*/
typedef struct Stack
{
ElemType *base; // 栈基址,在构造和销毁之前,base的值为NULL
ElemType *top; // 栈顶指针
int stacksize; // 栈存储空间的尺寸,以元素为单位
} SqStack;
/*------------------------------------------------------------
// 栈的基本操作
------------------------------------------------------------*/
bool InitStack(SqStack *S);
void DestroyStack(SqStack *S);
bool StackEmpty(SqStack S);
int StackLength(SqStack S);
bool GetTop(SqStack S, ElemType *e);
void StackTraverse(SqStack S, void (*fp)(ElemType));
bool Push(SqStack *S, ElemType e);
bool Pop(SqStack *S, ElemType *e);
#endif /* DYNASEQSTACK_H */
==================================
/***
*ElemType.cpp - ElemType的实现
*
****/
#include <stdio.h>
#include "ElemType.h"
int compare(ElemType x, ElemType y)
{
return(x-y);
}
void visit(ElemType e)
{
printf("%d/n", e);
}
=======================
/***
*DynaSeqStack.cpp - 动态顺序栈,即栈的动态顺序存储实现
*
*
*
****/
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include "DynaSeqStack.h"
const int STACK_INIT_SIZE = 100; // 初始分配的长度
const int STACKINCREMENT = 10; // 分配内存的增量
/*------------------------------------------------------------
操作目的: 初始化栈
初始条件: 无
操作结果: 构造一个空的栈
函数参数:
SqStack *S 待初始化的栈
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool InitStack(SqStack *S)
{
assert(S!=NULL);//判断栈是否存在
S->base= (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));//初始化栈底
if (!S->base)
{
exit(0);
}
S->top = S->base;//初始化时 栈底=栈顶
S->stacksize = STACK_INIT_SIZE;//栈的长度 //顺序栈固定,可以动态的增大
return true;
}
/*------------------------------------------------------------
操作目的: 销毁栈
初始条件: 栈S已存在
操作结果: 销毁栈S
函数参数:
SqStack *S 待销毁的栈
返回值:
无
------------------------------------------------------------*/
void DestroyStack(SqStack *S)
{
assert(S != NULL);//判断栈是否存在
free(S->base);//释放栈底
S->base=S->top = NULL;//栈底和栈顶都为空 清空时相同
}
/*------------------------------------------------------------
操作目的: 判断栈是否为空
初始条件: 栈S已存在
操作结果: 若S为空栈,则返回true,否则返回false
函数参数:
SqStack S 待判断的栈
返回值:
bool 是否为空
------------------------------------------------------------*/
bool StackEmpty(SqStack S)
{
assert((S.base != NULL) &&(S.top != NULL));//判断栈底和栈顶是否存在
return (S.base == S.top);//若栈底=栈顶 则为空
}
/*------------------------------------------------------------
操作目的: 得到栈的长度
初始条件: 栈S已存在
操作结果: 返回S中数据元素的个数
函数参数:
SqStack S 栈S
返回值:
int 数据元素的个数
------------------------------------------------------------*/
int StackLength(SqStack S)
{
assert((S.base != NULL) &&(S.top != NULL));//判断栈底和栈顶是否存在
return (S.top-S.base);//因为是顺序栈,栈顶-栈底为栈中元素的个数
}
/*------------------------------------------------------------
操作目的: 得到栈顶元素
初始条件: 栈S已存在
操作结果: 用e返回栈顶元素
函数参数:
SqStack S 栈S
ElemType *e 栈顶元素的值
返回值:
bool 操作是否成功 若栈不空,则用e返回S的栈顶元素,并返回ture,否则返回flase
------------------------------------------------------------*/
bool GetTop(SqStack S, ElemType *e)
{
assert((S.base != NULL) &&(S.top != NULL));//判断栈底和栈顶是否存在
if (S.top == S.base)//若栈为空,错误
{
exit(0);
}
*e = *( S.top-1);//栈顶指针指向下一个元素
return true;
}
/*------------------------------------------------------------
操作目的: 遍历栈
初始条件: 栈S已存在
操作结果: 依次对S的每个元素调用函数fp
函数参数:
SqStack S 栈S
void (*fp)() 访问每个数据元素的函数指针
返回值:
无
------------------------------------------------------------*/
void StackTraverse(SqStack S, void (*fp)(ElemType))
{
assert((S.base != NULL) &&(S.top != NULL));//判断栈底和栈顶是否存在
for (;S.base<S.top;S.base++)
{
(*fp)(*S.base);//先进后出 遍历时从栈底依次输出
}
}
/*------------------------------------------------------------
操作目的: 压栈——插入元素e为新的栈顶元素
初始条件: 栈S已存在
操作结果: 插入数据元素e作为新的栈顶
函数参数:
SqStack *S 栈S
ElemType e 待插入的数据元素
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool Push(SqStack *S, ElemType e)
{
if (S == NULL)//栈不存在,错误
{
return false;
}
assert((S->base != NULL) &&(S->top != NULL));//判断栈底和栈顶是否存在
if (S->top-S->base >= S->stacksize)//栈满,追加存储空间
{
S->base = (ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType));
if (!S->base)//内存分配失败
{
exit(0);
}
S->top = S->base + S->stacksize;//栈顶下移
S->stacksize += STACKINCREMENT;//栈的长度
}
*(S->top++) = e;//栈顶元素为e,然后栈顶在下移指向下一个内存单元
return true;
}
/*------------------------------------------------------------
操作目的: 弹栈——删除栈顶元素
初始条件: 栈S已存在且非空
操作结果: 删除S的栈顶元素,并用e返回其值
函数参数:
SqStack *S 栈S
ElemType *e 被删除的数据元素值
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool Pop(SqStack *S, ElemType *e)
{
if ((*S).top == (*S).base)//空栈为错误
{
return false;
}
*e = * --(*S).top;//弹栈栈顶元素为e,然后栈顶在下移指向下一个内存单元
return true;
}
==========================
#include <stdio.h>
#include <stdlib.h>
#include "DynaSeqStack.h"
int main()
{
SqStack s1;
InitStack(&s1);
//
// for (int i=0;i<10;i++)
// {
// Pop(&s1,&i);
// }
// StackTraverse(&s1,visit());
// for (int j=0;j<10;j++)
// {
// Push(&s1,j);
// }
//StackTraverse(&s1,visit());
system("pause");
return 0;
}
- 栈的动态链表的实现
- 链表的动态实现
- 栈的动态实现
- 栈的动态实现
- 串的动态链表的实现
- 链表实现动态的数组开辟!
- 汇编实现的动态栈
- 动态栈的实现(C++)
- 栈的动态数组实现
- 动态顺序栈的实现
- 动态交叉表的实现
- 动态交叉表的实现
- 顺序表的动态实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态表的基本实现
- 动态顺序表的实现
- windows快捷键大全
- 111111111111
- Jquery Ajax服务器返回数据问题
- 学习
- ZendFramework 配置连接数据库
- 栈的动态链表的实现
- 怎么从数据库里动态获取数据放置select 标签里
- “用户级线程”和“内核级线程”概念上的迷糊
- Linux Shell学习笔记
- 系统管理
- lwuit精简[转]
- 《诗盗·私语》
- VB与EXCEL
- Model,与数据库,框架和开发方式无关