stack.h
#ifndef _STACH_H_
#define _STACH_H_
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct node
{
DataType data;
struct node *pNext;
}StackNode;
typedef struct list
{
StackNode *pTop;//栈顶
int cLen;
}StackList;
extern StackList *createStackList();
extern void showForEachStack(StackList *pList);
extern int pushStack(StackList *pList,DataType data);
extern int popStack(StackList *pList,DataType *poutdata);
extern DataType getStackTop(StackList *pList);
extern void destroyStack(StackList **pList);
#endif
stack.c
#include "stack.h"
/*创建栈*/
StackList *createStackList()
{
StackList *pList = malloc(sizeof(StackList));
if(NULL == pList)
{
perror("createStackList malloc error!\n");
return NULL;
}
pList->pTop = NULL;
pList->cLen = 0;
return pList;
}
/*遍历输出栈(原则上不允许,这里为了验证其他操作)*/
void showForEachStack(StackList *pList)
{
StackNode *pTmpNode = pList->pTop;
while(pTmpNode != NULL)
{
printf("%d ",pTmpNode->data);
pTmpNode = pTmpNode->pNext;
}
printf("\n");
}
/*判断是否空栈*/
int isEmptyStack(StackList *pList)
{
return 0 == pList->cLen;
}
/*入栈*/
int pushStack(StackList *pList,DataType data)
{
StackNode *pushNode = malloc(sizeof(StackNode));
if(NULL == pushNode)
{
perror("pushStack malloc error!\n");
return -1;
}
pushNode->data = data;
pushNode->pNext = pList->pTop;
pList->pTop = pushNode;
pList->cLen++;
return 0;
}
/*出栈*/
int popStack(StackList *pList,DataType *poutdata)
{
if(isEmptyStack(pList))
{
return 0;
}
StackNode *pFreeNode = pList->pTop;
pList->pTop = pFreeNode->pNext;
if(poutdata != NULL)
{
*poutdata = pFreeNode->data;
}
free(pFreeNode);
pList->cLen--;
return 0;
}
/*获取栈顶元素*/
DataType getStackTop(StackList *pList)
{
return pList->pTop->data;
}
/*销毁*/
void destroyStack(StackList **pList)
{
while((*pList)->pTop != NULL)
{
popStack(*pList,NULL);
}
free(*pList);
*pList = NULL;
}
main.c
#include "stack.h"
int main(int argc, const char *argv[])
{
StackList *pList = NULL;
StackNode *pTmpNode = NULL;
pList = createStackList(pList);
int i = 0;
for(i = 10;i > 0;i--)
{
pushStack(pList,i);
}
popStack(pList,NULL);
popStack(pList,NULL);
showForEachStack(pList);
printf("%d\n",getStackTop(pList));
destroyStack(&pList);
return 0;
}