当前位置:  编程技术>c/c++/嵌入式

C语言栈顺序结构实现代码

    来源: 互联网  发布时间:2014-10-22

    本文导语:  代码如下:/*** @brief C语言实现的顺序结构类型的栈* @author wid* @date 2013-10-29** @note 若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢!*/ #include #include #include #define TRUE 1#define FALSE 0 typedef struct Point2D{    int x;    int y;}ElemType;     ...

代码如下:

/**
* @brief C语言实现的顺序结构类型的栈
* @author wid
* @date 2013-10-29
*
* @note 若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢!
*/

#include
#include
#include

#define TRUE 1
#define FALSE 0

typedef struct Point2D
{
    int x;
    int y;
}ElemType;      //栈元素结构

typedef struct
{
    ElemType *btm;      //栈底
    ElemType *top;      //栈顶
    int height;         //栈高
    int size;           //栈总大小
}ArrStack;      //栈结构

//栈方法声明
ArrStack *CreateStack( int nSize );             ///创建一个大小为nSize的栈
void DestroyStack( ArrStack *pStack );          ///销毁栈 pStack
void ClearStack( ArrStack *pStack );            ///清空栈 pStack 内的元素
int GetHeight( ArrStack *pStack );              ///获取栈 pStack 的高度
int GetSize( ArrStack *pStack );                ///获取栈 pStack 的总容量
int IsEmpty( ArrStack *pStack );                ///检测栈 pStack 是否为空栈
int Push( ArrStack *pStack, ElemType *pt );     ///将元素 pt 压入栈 pStack
int Pop( ArrStack *pStack, ElemType *pt );      ///将栈顶元素出栈到 pt
int GetTop( ArrStack *pStack, ElemType *pt );   ///获取栈顶元素到 pt
void ForEachStack( ArrStack *pStack, void (*func)(ElemType *pt) );      ///从栈底到栈顶的每个元素依次执行 func 函数
void ReForEachStack( ArrStack *pStack, void (*func)(ElemType *pt) );    ///从栈顶到栈底的每个元素依次执行 func 函数


//栈方法实现

/**
* @brief 创建一个大小为 nSize 的栈
*
* @param nSize 栈的初始大小
*
* @return 返回指向创建的栈的指针
*
* @note nSize 初始大小需大于0
*/
ArrStack *CreateStack( int nSize )
{
    //根据栈结构创建一个栈
    ArrStack *pStack = (ArrStack *)malloc( sizeof(ArrStack) );

    //申请栈初始空间
    pStack->btm = (ElemType *)calloc( nSize, sizeof(ElemType) );

    //令栈顶指向栈底元素
    pStack->top = &pStack->btm[0];

    //初始化栈高度为 0
    pStack->height = 0;

    //初始化栈大小为初始大小
    pStack->size = nSize;

    return pStack;
}

/**
* @brief 销毁栈 pStack
*
* @param pStack 指向待销毁的栈的指针
*
* @return void
*/
void DestroyStack( ArrStack *pStack )
{
    //释放栈内元素
    free( pStack->btm );

    //释放栈
    free( pStack );
}

/**
* @brief 清空栈内元素
*
* @param pStack 指向待清空元素的栈的指针
*
* @return void
*/
void ClearStack( ArrStack *pStack )
{
    //令栈顶指向栈底
    pStack->top = &pStack->btm[0];

    //将栈高度置为 0
    pStack->height = 0;
}

/**
* @brief 获取栈 pStack 的高度
*
* @param pStack 指向待获取高度的栈的指针
*
* @param 返回当前栈的高度
*/
int GetHeight( ArrStack *pStack )
{
    return pStack->height;
}

/**
* @brief 获取栈 pStack 的总容量
*
* @param pStack 指向待获取总容量的栈的指针
*
* @return 返回栈的当前总容量
*/
int GetSize( ArrStack *pStack )
{
    return pStack->size;
}

/**
* @brief 检测栈 pStack 是否为空栈
*
* @param pStack 指向待检测的栈的指针
*
* @return 若栈为空, 则返回 TRUE, 否则返回 FALSE
*/
int IsEmpty( ArrStack *pStack )
{
    return pStack->height == 0 ? TRUE : FALSE;
}

/**
* @brief 将元素 pt 压入栈 pStack
*
* @param pStack 指向待压入元素的栈的指针
* @param pt 指向待压入元素的指针
*
* @return 返回成功压入后栈的高度
*/
int Push( ArrStack *pStack, ElemType *pt )
{
    ///检测是否需要扩容
    if( pStack->height == pStack->size )
    {   //需要扩容

        //重新申请于原栈大小2倍大小的栈空间
        ElemType *pe = (ElemType *)calloc( pStack->size * 2, sizeof(ElemType) );

        //将旧栈内容拷贝到新栈内容
        memcpy( pe, pStack->btm, pStack->size * sizeof(ElemType) );

        //重置栈总容量大小
        pStack->size = pStack->size * 2;

        //释放旧栈空间
        free( pStack->btm );

        //将栈底指向新开辟的栈空间
        pStack->btm = pe;

        //栈顶指向新栈最后一个元素
        pStack->top = &pe[pStack->height-1];
    }

    //将新元素压入栈
    pStack->btm[pStack->height].x = pt->x;
    pStack->btm[pStack->height].y = pt->y;

    //栈高度自增一
    ++pStack->height;

    //栈顶指向最新栈元素
    pStack->top = &pStack->btm[pStack->height-1];

    return pStack->height;
}

/**
* @brief 将栈顶元素出栈 到 pt
*
* @param pStack 指向待弹出元素的栈的指针
* @param pt 指向接收弹出的元素的指针
*
* @return 出栈成功则返回出栈后栈的高度, 否则返回 -1
*/
int Pop( ArrStack *pStack, ElemType *pt )
{
    ///是否为空栈
    if( pStack->height == 0 )
        return -1;

    //将栈顶元素赋值到 pt
    pt->x = pStack->top->x;
    pt->y = pStack->top->y;

    //栈高度减一
    --pStack->height;

    //栈顶指向栈顶元素的上一个元素
    pStack->top = &pStack->btm[pStack->height-1];

    return pStack->height;
}

/**
* @brief 获取栈顶元素到 pt
*
* @param pStack 指向待弹出元素的栈的指针
* @param pt 指向接收弹出的元素的指针
*
* @return 获取成功则返回栈顶元素的位置, 否则返回 -1
*
* @note 元素位置由 0 计起
*/
int GetTop( ArrStack *pStack, ElemType *pt )
{
    pt->x = pStack->top->x;
    pt->y = pStack->top->y;

    return pStack->height;
}

/**
* @brief 从栈底到栈顶的每个元素依次执行 func 函数
*
* @param pStack 指向待处理的栈的指针
* @param func 需要执行的函数的指针
*
* @return void
*/
void ForEachStack( ArrStack *pStack, void (*func)(ElemType *pt) )
{
    int i = 0;
    for( i = 0; i height; ++i )
    {
        func( &pStack->btm[i] );
    }
}

/**
* @brief 从栈顶到栈底的每个元素依次执行 func 函数
*
* @param pStack 指向待处理的栈的指针
* @param func 需要执行的函数的指针
*
* @return void
*/
void ReForEachStack( ArrStack *pStack, void (*func)(ElemType *pt) )
{
    int i = pStack->height - 1;
    for( i; i >= 0; --i )
    {
        func( &pStack->btm[i] );
    }
}

//测试

void display( ElemType *pt )
{
    printf( "(%d,%d) ", pt->x, pt->y );
}

int main()
{
    ///测试创建初始大小为 5 的栈
    ArrStack *psk = CreateStack( 5 );

    ///测试 IsEmpty、GetSize、GetHeight
    if( IsEmpty(psk) == TRUE )
        printf( "Stack Size=%d, Stack Height=%dn", GetSize(psk), GetHeight(psk) );

    ElemType pt;

    int i = 0;
    ///测试Push, 向栈内压入8个元素
    printf( "n向栈内压入8个元素后:n" );
    for( i = 0; i < 8; ++i )
    {
        pt.x = pt.y = i;
        Push( psk, &pt );
    }
    //输出压入8个元素后的栈状态
    printf( "Is empty = %dn", IsEmpty(psk) );
    printf( "Stack size = %dn", GetSize(psk) );
    printf( "Stack height = %dn", GetHeight(psk) );

    ///测试 ForEachStack、ReForEachStack
    printf( "n测试 ForEachStack、ReForEachStack:n" );
    ForEachStack( psk, display );
    putchar('n');
    ReForEachStack( psk, display );
    putchar('n');

    ///测试getTop
    GetTop( psk, &pt );
    printf( "n栈顶元素为: (%d,%d)n", pt.x, pt.y );

    ///测试 Pop
    Pop( psk, &pt );
    printf( "nPop弹出的元素为(%d,%d), 弹出后栈高:%dn", pt.x, pt.y, GetHeight(psk) );
    Pop( psk, &pt );
    printf( "nPop弹出的元素为(%d,%d), 弹出后栈高:%dn", pt.x, pt.y, GetHeight(psk) );

    ///测试Push
    pt.x = pt.y = 100;
    Push( psk, &pt );
    printf( "nPop压入的元素为(%d,%d), 压入后栈高:%dn", pt.x, pt.y, GetHeight(psk) );

    ///执行全面出栈操作
    printf( "n执行全面出栈:n" );
    int n = GetHeight(psk);
    for( i = 0; i < n; ++i )
    {
        Pop( psk, &pt );
        printf( "Pop弹出的元素为(%d,%d), 弹出后栈高:%dn", pt.x, pt.y, GetHeight(psk) );
    }

    ///销毁栈
    DestroyStack( psk );

    return 0;
}

测试结果:


    
 
 

您可能感兴趣的文章:

  • c语言实现顺序表的基本操作
  • C语言实现顺序表基本操作汇总
  • C语言线性表的顺序表示与实现实例详解
  • C语言顺序表实现代码排错
  • 结构化脚本语言 puppy
  • 请教:关于c语言结构的问题!
  • c语言实现MD5算法完整代码示例 iis7站长之家
  • 求高人指点,B/S结构的带复杂数据库(包含了图片等)的软件用什么语言开发好?
  • 关于C语言结构体初始化的疑问
  • 我想开发一个基于BS结构的办公自动化程序,不知道用哪种语言合适,请大虾指教!
  • 请教c语言结构体嵌套问题。field `atItem' has incomplete type
  • 我想用vim编辑c语言,希望数据结构可以自动补全,什么插件好呢,网上找了好多啊,眼都花了,哪位有经验??我用的是ubuntu
  • C/C++语言中结构体的内存分配小例子
  • c语言中位字段与结构联合的组合使用详解
  • 昨天买了本数据结构(JAVA语言版),大家说说这书怎么样?清华大学出版社,32.00RMB
  • 浅谈C语言中结构体的初始化
  • C语言 结构体动态数组内存释放问题
  • 请问这类Linux下的C语言结构如何迁移到windows下
  • Solaris下 C 语言编译时结构体成员对齐问题,请教!急!先谢了!
  • C语言循环结构与时间函数用法实例教程
  • 深入分析C语言中结构体指针的定义与引用详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • C语言中间语言 CIL
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 动态编程语言 LIME编程语言
  • c语言实现MD5算法完整代码示例
  • C语言如何改变当前语言环境
  • 以NetBeans IDE为例介绍如何使用XML中Schema语言
  • 如何在VIM中使汇编语言和C语言自动缩进?
  • c语言基于libpcap实现一个抓包程序过程
  • 我安装的linux时默认语言选择的是中文,又乱码,怎么可以解决?怎么更改默认语言成英文?
  • HTML超文本标记语言教程及实例
  • Redhat9安装时语言只选择了中文,现在还能再增加其它语言的支持吗?如英文
  • MD5算法的C语言实现
  • 请问哪里有ubuntu 9.0版本的中文语言包和KDE的中文语言包下载,我用Google搜索了很多地方都没有!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3