您的位置:首页 > 理论基础 > 数据结构算法

(3)数据结构——栈(数组)实现

2013-08-07 11:30 253 查看
栈:是一种线性表,是一种限定在表尾进行杀入和删除操作的特殊线性表。

栈的数组实现:

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;
}


后边会继续写出栈的链式实现及相关的栈的应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: