源码:
status.h
#ifndef STATUS_H
#define STATUS_H
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int SElemType;
#endif
stack.h
#ifndef STACK_H
#define STACK_H
#include <stdio.h>
#include "status.h"
#define STACK_INIT_SIZE 100 //线性表存储空间的初始分配量
#define STACKINCREMENT 10 //线性表存储空间的分配增量
typedef struct {
SElemType *elem; //指向存放线性表中数据元素的基地址
int length; //线性表的当前长度
int stacksize; //当前分配的存储容量
}SqStack;
/*
(1)初始化栈 InitStack(S)
(2)入栈 Push(S,item)
(3)出栈 Pop(S,item)
(4)获取栈顶元素内容 GetTop(S,item)
(5)判断栈是否为空 StackEmpty(S)
*/
Status InitStack(SqStack *s);
Status Push(SqStack *s,SElemType e);
Status Pop(SqStack *s,SElemType *e);
Status GetTop(SqStack *s,SElemType *e);
Status StackEmpty(SqStack *s);
#endif
stack.c
#include <stdio.h>
#include "stack.h"
Status InitStack(SqStack *s)//进行初始化栈
{
s->elem=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(s->elem==NULL)
{
return ERROR;
}
s->length=0;//说明没有元素
s->stacksize=STACK_INIT_SIZE;//为栈开辟内存空间
return OK;
}
Status Push(SqStack *s,SElemType e)
{
//是否满,扩容
if(s->length==s->stacksize)//元素个数正好占据满了开辟的内存空间
{
s->elem=(SElemType *)realloc(s->elem,(s->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(s->elem==NULL)
{
return ERROR;
}
}
s->elem[s->length]=e;
s->length++;
return OK;
}
Status Pop(SqStack *s,SElemType *e)
{
if(s->length==0)
return ERROR;
*e=s->elem[s->length-1];
s->length--;
return TRUE;
}
Status GetTop(SqStack *s,SElemType *e)//获取栈顶元素内容
{
if(s->length==0)
return ERROR;
*e=s->elem[s->length-1];
return TRUE;
}
Status StackEmpty(SqStack *s)//判断栈是否为空
{
return s->length==0?TRUE:ERROR;
}
main.c
#include "stack.h"
#include <stdio.h>
int main()
{
SqStack sq;
SqStack *s=&sq;
int i,t,n,site;
SElemType value;
printf("==================初始化栈==================\n");
t=InitStack(s);
if(t==ERROR)
printf("-----栈初始化失败------");
else
{
printf("栈中元素个数为:%d\n栈开辟的内存空间为:%d\n",s->length,s->stacksize);
}
printf("==================栈内存中添加元素==================\n");
printf("请输入你要添加元素的个数为:");
scanf("%d",&n);
printf("请依次输入%d元素:",n);
for(i=1;i<=n;i++)
{
scanf("%d",&value);
Push(s,value);
}
printf("此时栈中的元素为:");
for(i=0;i<n;i++)
printf("%d ",s->elem[i]);
printf("\n==================元素进栈==================\n");
printf("请输入你要进栈的数:");
scanf("%d",&value);
Push(s,value);
printf("\n此时栈中的元素为:");
for(i=0;i<s->length;i++)
printf("%d ",s->elem[i]);
printf("\n==================元素出栈==================\n");
Pop(s,&value);
printf("出栈的元素为:%d\n",value);
printf("此时栈中的元素为:");
for(i=0;i<s->length;i++)
printf("%d ",s->elem[i]);
printf("\n==================获取栈顶元素内容==================\n");
t=GetTop(s,&value);
if(t==ERROR)
printf("-----获取栈顶元素失败------");
else
printf("栈顶元素为:%d",value) ;
printf("\n==================判断栈是否为空 ==================\n");
t=StackEmpty(s);
if(t==TRUE)
printf("---线性表为空---\n");
else
printf("---线性表不为空---\n");
}