概述
哎,,,颓废了,,好几天没写博客记录我的小生活了,不过这几天也弄了不少东西但是不能写博客,大概说说吧,,1.Ubuntu,就这个东西我安装了两次,两种方法一种是图形的,一种是文本模式的,顾名思义图形安装就和安装windows一样,简单能认识字差不多,文本模式就比较复杂了,全英文撞期来比较麻烦,2.复习,主要是复习数据结构了,把所有的存储结构还有涉及到的一些操作全都在纸上写了一遍,手快写烂了,,不说了言归正传。
这次写的是动态顺序栈的定义,没什么难点把base和top指针操控好了就没什么大问题了
1.定义ElenType,方便更改类型(本程序采用ElemType 为int类型)
/***
*ElemType.h - ElemType的定义
*
****/
#ifndef ELEMTYPE_H
#define ELEMTYPE_H
typedef int ElemType;
int compare(ElemType x, ElemType y);
void visit(ElemType e);
#endif /* ELEMTYPE_H */
2.定义动态顺序栈和基本操作
/***
*DynaSeqStack.h - 动态顺序栈的定义
*
****/
#if !defined(DYNASEQSTACK_H)
#define DYNASEQSTACK_H
#include "ElemType.h"
/*------------------------------------------------------------
// 栈结构的定义
------------------------------------------------------------*/
typedef struct Stack
{
ElemType *base; // 栈基址
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 */
3..顺序栈基本操作的实现
/***
*DynaSeqStack.cpp - 动态顺序栈,即栈的动态顺序存储实现
*
*
*题目:实验3-1 栈的动态顺序存储实现
*
*班级:
*
*姓名:
*
*学号:
*
****/
#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)
{
S -> base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!S -> base)
{
return false;
}
S -> top = S -> base;
S -> stacksize = STACK_INIT_SIZE;
return true;
}
/*------------------------------------------------------------
操作目的: 销毁栈
初始条件: 栈S已存在
操作结果: 销毁栈S
函数参数:
SqStack *S 待销毁的栈
返回值:
无
------------------------------------------------------------*/
void DestroyStack(SqStack *S)
{
free(S -> base);
S -> base = NULL;
S -> top = NULL;
S -> stacksize = 0;
}
/*------------------------------------------------------------
操作目的: 判断栈是否为空
初始条件: 栈S已存在
操作结果: 若S为空栈,则返回true,否则返回false
函数参数:
SqStack S 待判断的栈
返回值:
bool 是否为空
------------------------------------------------------------*/
bool StackEmpty(SqStack S)
{
if(S.base != S.top)
{
return false;
}
return true;
}
/*------------------------------------------------------------
操作目的: 得到栈的长度
初始条件: 栈S已存在
操作结果: 返回S中数据元素的个数
函数参数:
SqStack S 栈S
返回值:
int 数据元素的个数
------------------------------------------------------------*/
int StackLength(SqStack S)
{
return S.top - S.base;
}
/*------------------------------------------------------------
操作目的: 得到栈顶元素
初始条件: 栈S已存在
操作结果: 用e返回栈顶元素
函数参数:
SqStack S 栈S
ElemType *e 栈顶元素的值
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool GetTop(SqStack S, ElemType *e)
{
if(S.base == S.top)
return false; //栈空
*e = *(S.top - 1);
return true;
}
/*------------------------------------------------------------
操作目的: 遍历栈
初始条件: 栈S已存在
操作结果: 依次对S的每个元素调用函数fp
函数参数:
SqStack S 栈S
void (*fp)() 访问每个数据元素的函数指针
返回值:
无
------------------------------------------------------------*/
void StackTraverse(SqStack S, void (*fp)(ElemType))
{
ElemType *p = S.base;
while(p != S.top)
{
fp(*p++);
}
}
/*------------------------------------------------------------
操作目的: 压栈——插入元素e为新的栈顶元素
初始条件: 栈S已存在
操作结果: 插入数据元素e作为新的栈顶
函数参数:
SqStack *S 栈S
ElemType e 待插入的数据元素
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool Push(SqStack *S, ElemType e)
{
if(S -> top - S -> base >= S -> stacksize)
{
S -> base = (ElemType*)realloc(S -> base,(S -> stacksize + STACK_INIT_SIZE)*sizeof(ElemType));
if(!S->base)
return false;
S -> top = S -> base + S -> stacksize;
S -> stacksize += STACK_INIT_SIZE;
}
*(S -> top++) = e;
return true;
}
/*------------------------------------------------------------
操作目的: 弹栈——删除栈顶元素
初始条件: 栈S已存在且非空
操作结果: 删除S的栈顶元素,并用e返回其值
函数参数:
SqStack *S 栈S
ElemType *e 被删除的数据元素值
返回值:
bool 操作是否成功
------------------------------------------------------------*/
bool Pop(SqStack *S, ElemType *e)
{
if(S->base == S->top)
return false; //栈空
*e = *(--S->top);
return true;
}
4.主函数(程序入口点,可以自定义,想怎么玩就怎么玩,玩坏了自己负责O(∩_∩)O哈哈~)
下面是我瞎玩的,已被玩坏,千!万!不!要!用!
#include <stdio.h>
#include "DynaSeqStack.h"
int main()
{
// TODO: Place your test code here
SqStack a;
int b;
printf("创建栈a: %dnn",InitStack(&a));
printf("栈a是否为空: %dnn",StackEmpty(a));
for(int i = 0;i<105;i++)
{
b = Push(&a,i);
}
printf("压栈是否成功: %dnn",b);
printf("压栈105个后长度: %dnn",StackLength(a));
printf("栈a是否为空: %dnn",StackEmpty(a));
GetTop(a,&b);
printf("获取栈顶元素: %dnn",b);
Pop(&a,&b);
printf("出栈顶元素: %dnn",b);
GetTop(a,&b);
printf("获取栈顶元素: %dnn",b);
DestroyStack(&a);
printf("销毁栈后长度: %dnn",StackLength(a));
return 0;
}
最后
以上就是还单身春天为你收集整理的动态顺序栈的定义的全部内容,希望文章能够帮你解决动态顺序栈的定义所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复