我是靠谱客的博主 还单身春天,最近开发中收集的这篇文章主要介绍动态顺序栈的定义,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

   哎,,,颓废了,,好几天没写博客记录我的小生活了,不过这几天也弄了不少东西但是不能写博客,大概说说吧,,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;
}

最后

以上就是还单身春天为你收集整理的动态顺序栈的定义的全部内容,希望文章能够帮你解决动态顺序栈的定义所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部