(3)数据结构——栈(数组)实现
2013-08-07 11:30
253 查看
栈:是一种线性表,是一种限定在表尾进行杀入和删除操作的特殊线性表。
栈的数组实现:
ArrayStack.h
ArrayStack.c
数据元素 ElemType.h
ElemType.c
testmain.c
后边会继续写出栈的链式实现及相关的栈的应用。
栈的数组实现:
ArrayStack.h
/********************************************************************* *: *: *: Author: dspeeding *: Copyright (c) 2012, dspeeding *: *: Created at: 2012.06.15 *: Last modified: 2012.06.15 *: *: Introduction: 数组栈(数据结构)的c实现 *: *: *:*********************************************************************/ #ifndef _ARRAYSTACK_H_ #define _ARRAYSTACK_H_ #include "ElemType.h" typedef struct TDefArrayStack { int nTop; int nMaxSize; PElemType pArray; }ArrayStack; typedef ArrayStack* PArrayStack; typedef const ArrayStack CArrayStack; typedef const ArrayStack* PCArrayStack; /**************************************** Purpose : 初始化数组栈 Input : pStack -- 栈指针 nMaxSize -- 栈容量 Return : 0 --OK -1 --FAIL *****************************************/ int InitArrayStack(PArrayStack pStack, int nMaxSize); /**************************************** Purpose : 判断栈是否为空 Input : pStack -- 栈指针 Return : 0 --空 -1 --非空 *****************************************/ int IsEmptyArrayStack(PArrayStack pStack); /**************************************** Purpose : 判断栈是否已满 Input : pStack -- 栈指针 Return : 0 --满 -1 --没满 *****************************************/ int IsFullArrayStack(PArrayStack pStack); /**************************************** Purpose : 入栈 Input : pStack --栈指针 pVal --数据指针 Return : 0 --OK -1 --Fail *****************************************/ int PushArrayStack(PArrayStack pStack, PCElemType pVal); /**************************************** Purpose : 出栈 Input : pStack --栈指针 pVal --数据指针 Return : 0 --OK -1 --Fail *****************************************/ int PopArrayStack(PArrayStack pStack, PElemType pVal); /**************************************** Purpose : 取栈顶数据 Input : pStack --栈指针 pVal --数据指针 Return : 0 --OK -1 --Fail *****************************************/ int GetTopArrayStack(PArrayStack pStack, PElemType pVal); /**************************************** Purpose : 销毁栈 Input : pStack --栈指针 Return : 0 --OK -1 --Fail *****************************************/ int DestroyArrayStack(PArrayStack pStack); #endif
ArrayStack.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "ArrayStack.h" /************************************************************************* Function: InitArrayStack() Purpose : 初始化数组栈 Input : pStack -- 栈指针 nMaxSize -- 栈容量 Return : 0 --OK -1 --FAIL Modify : Remark : *************************************************************************/ int InitArrayStack(PArrayStack pStack, int nMaxSize) { pStack->pArray = (PElemType)malloc((nMaxSize+1) * sizeof(ElemType)); if(pStack->pArray == NULL) { /*申请内存空间失败*/ return -1; } pStack->nMaxSize = nMaxSize; pStack->nTop = 0; } /************************************************************************* Function: IsEmptyArrayStack() Purpose : 判断栈是否为空 Input : pStack -- 栈指针 Return : 0 --空 -1 --非空 Modify : Remark : **************************************************************************/ int IsEmptyArrayStack(PArrayStack pStack) { if(pStack->nTop == 0) { return 0; } return -1; } /************************************************************************* Function: IsFullArrayStack() Purpose : 判断栈是否已满 Input : pStack -- 栈指针 Return : 0 --满 -1 --没满 Modify : Remark : **************************************************************************/ int IsFullArrayStack(PArrayStack pStack) { if(pStack->nTop == pStack->nMaxSize) { return 0; } return -1; } /************************************************************************* Function: AgainMallocArrayStack() Purpose : 空间扩展为原来的2倍,原内容被自动拷贝到pStack所指向的存储空间中 Input : pStack --栈指针 Return : None Modify : Remark : *************************************************************************/ int AgainMallocArrayStack(PArrayStack pStack) { int i; PElemType pTempData; pTempData = realloc(pStack->pArray, 2*pStack->nMaxSize*sizeof(ElemType)); if(!pTempData) { /*动态存储空间分配失败*/ return -1; } /*指向新的队列空间*/ pStack->pArray = pTempData; pStack->nMaxSize = 2 * pStack->nMaxSize; return 0; } /************************************************************************* Function: PushArrayStack() Purpose : 入栈 Input : pStack --栈指针 pVal --数据指针 Return : 0 --OK -1 --Fail Modify : Remark : **************************************************************************/ int PushArrayStack(PArrayStack pStack, PCElemType pVal) { if(IsFullArrayStack(pStack) == 0) { /*栈满*/ if(AgainMallocArrayStack(pStack)) { return -1; } } pStack->nTop += 1; memcpy(&pStack->pArray[pStack->nTop], pVal, sizeof(ElemType)); return 0; } /************************************************************************* Function: PopArrayStack() Purpose : 出栈 Input : pStack --栈指针 pVal --数据指针 Return : 0 --OK -1 --Fail Modify : Remark : **************************************************************************/ int PopArrayStack(PArrayStack pStack, PElemType pVal) { if(IsEmptyArrayStack(pStack) == 0) { /*栈空*/ return -1; } memcpy(pVal, &pStack->pArray[pStack->nTop], sizeof(ElemType)); memset(&pStack->pArray[pStack->nTop], 0, sizeof(ElemType)); pStack->nTop -= 1; return 0; } /************************************************************************* Function: GetTopArrayStack() Purpose : 取栈顶数据 Input : pStack --栈指针 pVal --数据指针 Return : 0 --OK -1 --Fail Modify : Remark : **************************************************************************/ int GetTopArrayStack(PArrayStack pStack, PElemType pVal) { if(IsEmptyArrayStack(pStack) == 0) { /*栈空*/ return -1; } memcpy(pVal, &pStack->pArray[pStack->nTop], sizeof(ElemType)); return 0; } /************************************************************************* Function: DestroyArrayStack() Purpose : 销毁栈 Input : pStack --栈指针 Return : 0 --OK -1 --Fail Modify : Remark : **************************************************************************/ int DestroyArrayStack(PArrayStack pStack) { if(pStack->pArray != NULL) { free(pStack->pArray); pStack->nTop = 0; } return 0; }
数据元素 ElemType.h
#ifndef _ELEMTYPE_H_ #define _ELEMTYPE_H_ /*定义需要的数据类型,这里可以是基本数据类型,也可以是结构体数据类型, 结构体中最好不要使用指针,使用结构体时请包含相关头文件*/ typedef int ElemType; typedef ElemType* PElemType; typedef const ElemType* PCElemType; /**************************************** Purpose : 打印数据 Input : pVal --要被打印的数据 Return : None *****************************************/ void visit(PCElemType pVal); #endif
ElemType.c
#include <stdio.h> #include "ElemType.h" /************************************************************************* Purpose : 打印输出数据 Input : pVal --要被打印的数据 Return : None Modify : Remark : *************************************************************************/ void visit(PCElemType pVal) { printf("%d\n",*pVal); }
testmain.c
#include <stdio.h> #include "ArrayStack.h" int main() { ElemType arr[7]={2,5,3,1,4,8,10}; ArrayStack mStack; int i; ElemType outData; InitArrayStack(&mStack, 4); for(i=0;i<7;i++) { if(PushArrayStack(&mStack, &arr[i])) { printf("push stack fail\n"); } } if(PopArrayStack(&mStack, &outData)) { printf("pop stack fail\n"); } visit(&outData); int a1 = 80; if(PushArrayStack(&mStack, &a1)) { printf("push stack fail\n"); } if(GetTopArrayStack(&mStack, &outData)) { printf("getTop stack fail\n"); } visit(&outData); while(IsEmptyArrayStack(&mStack)) { if(PopArrayStack(&mStack, &outData)) { printf("pop stack fail\n"); } visit(&outData); } DestroyArrayStack(&mStack); return 0; }
后边会继续写出栈的链式实现及相关的栈的应用。
相关文章推荐
- 数据结构之数组(C语言实现)
- 数据结构之线性表(数组实现)
- 经典数据结构之数组实现的队列
- 用数组实现js中的堆栈 或者队列数据结构
- C 数据结构使用数组和链表实现栈
- 【数据结构与算法】数组应用3:稀疏矩阵压缩(Java实现)
- 数据结构之数组的增删改查-java实现
- C语言------数据结构(栈操作,数组实现)
- 数据结构再学习--数组实现链表
- 数据结构与算法-----堆栈-使用数组(顺序结构)实现
- 数据结构之---C语言实现图的数组(邻接矩阵)存储表示
- 学会一种数据结构二:队列的数组实现和链表实现
- 数据结构——图的数组实现(邻接矩阵表示法)
- 数据结构之数组实现
- 数据结构之二叉树 使用数组实现
- 数据结构与算法-----队列-使用数组(顺序结构)实现
- 数据结构与算法之动态数组实现堆栈
- 数据结构之动态数组实现
- 数据结构之用数组和链表实现栈
- 数据结构——基于数组的优先级队列模板类实现