栈:是一种线性表,是一种限定在表尾进行杀入和删除操作的特殊线性表。
栈的数组实现:
ArrayStack.h
1 /********************************************************************* 2 *: 3 *: 4 *: Author: dspeeding 5 *: Copyright (c) 2012, dspeeding 6 *: 7 *: Created at: 2012.06.15 8 *: Last modified: 2012.06.15 9 *: 10 *: Introduction: 数组栈(数据结构)的c实现 11 *: 12 *: 13 *:*********************************************************************/ 14 #ifndef _ARRAYSTACK_H_ 15 #define _ARRAYSTACK_H_ 16 17 #include "ElemType.h" 18 19 20 typedef struct TDefArrayStack 21 { 22 int nTop; 23 int nMaxSize; 24 PElemType pArray; 25 }ArrayStack; 26 27 typedef ArrayStack* PArrayStack; 28 typedef const ArrayStack CArrayStack; 29 typedef const ArrayStack* PCArrayStack; 30 31 32 /**************************************** 33 Purpose : 初始化数组栈 34 Input : pStack -- 栈指针 35 nMaxSize -- 栈容量 36 Return : 0 --OK 37 -1 --FAIL 38 *****************************************/ 39 int InitArrayStack(PArrayStack pStack, int nMaxSize); 40 41 42 /**************************************** 43 Purpose : 判断栈是否为空 44 Input : pStack -- 栈指针 45 Return : 0 --空 46 -1 --非空 47 *****************************************/ 48 int IsEmptyArrayStack(PArrayStack pStack); 49 50 51 52 /**************************************** 53 Purpose : 判断栈是否已满 54 Input : pStack -- 栈指针 55 Return : 0 --满 56 -1 --没满 57 *****************************************/ 58 int IsFullArrayStack(PArrayStack pStack); 59 60 61 /**************************************** 62 Purpose : 入栈 63 Input : pStack --栈指针 64 pVal --数据指针 65 Return : 0 --OK 66 -1 --Fail 67 *****************************************/ 68 int PushArrayStack(PArrayStack pStack, PCElemType pVal); 69 70 71 72 /**************************************** 73 Purpose : 出栈 74 Input : pStack --栈指针 75 pVal --数据指针 76 Return : 0 --OK 77 -1 --Fail 78 *****************************************/ 79 int PopArrayStack(PArrayStack pStack, PElemType pVal); 80 81 82 83 /**************************************** 84 Purpose : 取栈顶数据 85 Input : pStack --栈指针 86 pVal --数据指针 87 Return : 0 --OK 88 -1 --Fail 89 *****************************************/ 90 int GetTopArrayStack(PArrayStack pStack, PElemType pVal); 91 92 93 94 /**************************************** 95 Purpose : 销毁栈 96 Input : pStack --栈指针 97 Return : 0 --OK 98 -1 --Fail 99 *****************************************/ 100 int DestroyArrayStack(PArrayStack pStack); 101 102 #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
1 #include <stdio.h> 2 #include "ArrayStack.h" 3 4 int main() 5 { 6 ElemType arr[7]={2,5,3,1,4,8,10}; 7 ArrayStack mStack; 8 int i; 9 ElemType outData; 10 11 InitArrayStack(&mStack, 4); 12 for(i=0;i<7;i++) 13 { 14 if(PushArrayStack(&mStack, &arr[i])) 15 { 16 printf("push stack fail\n"); 17 } 18 } 19 20 if(PopArrayStack(&mStack, &outData)) 21 { 22 printf("pop stack fail\n"); 23 } 24 visit(&outData); 25 26 27 int a1 = 80; 28 if(PushArrayStack(&mStack, &a1)) 29 { 30 printf("push stack fail\n"); 31 } 32 33 34 if(GetTopArrayStack(&mStack, &outData)) 35 { 36 printf("getTop stack fail\n"); 37 } 38 visit(&outData); 39 40 41 while(IsEmptyArrayStack(&mStack)) 42 { 43 if(PopArrayStack(&mStack, &outData)) 44 { 45 printf("pop stack fail\n"); 46 } 47 visit(&outData); 48 } 49 50 DestroyArrayStack(&mStack); 51 52 return 0; 53 }
后边会继续写出栈的链式实现及相关的栈的应用。