// TEST.cpp : 定义控制台应用程序的入口点。
//
/************************************************************************/
/* 栈的顺序存储 */
/************************************************************************/
#include <STDIO.H>
#include <STDLIB.H>
/*
栈的数据抽象
*/
#define STACK_INIT_SIZE 100//栈的初始大小
#define STACKINCREMENT 10//追加的空间大小
#define _OK 1
#define _ERROR 0
typedef int SElemType;
typedef int Status;//记录函数状态
typedef struct {
int *base;//栈底指针
int *top;//栈顶指针
int stacksize;//栈的大小
} SqStack;
/*
栈的初始化函数
*/
Status InitStack(SqStack &S)
{
//为栈分配空间
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if (!S.base)return _ERROR;
S.top=S.base;//初始时让栈顶指向栈底
S.stacksize = STACK_INIT_SIZE;//栈的大小
return _OK;
}
/*
判断栈中的元素是否为空
*/
int Empty(SqStack S)
{
if(S.top==S.base)
return 1;
return 0;
}
/*
入栈操作
*/
Status Push(SqStack &S,SElemType e)
{
if ((int)(S.top-S.base)>=S.stacksize)//栈已满,需要重新分配内存空间
{
S.base=(SElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) return _ERROR;
S.top = S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;//压入元素,top指针加1
return _OK;
}
/*
出栈操作
*/
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base) return _ERROR;
e=*--S.top;//top指针先减去1,然后弹出元素到e
return _OK;
}
/*
取栈顶的元素,注意不是弹栈操作
*/
Status GetTop(SqStack S,SElemType &e)
{
if (!Empty(S))//如果栈不为空
e=*(S.top-1);
return _OK;
}
/*
打印栈中的元素
*/
void PrintStack(SqStack S)
{
for(SElemType*tempTop = S.top-1;tempTop!=S.base-1;tempTop--)
printf("%d\n",*(tempTop));
}
void main()
{
SElemType e;
SqStack S;
InitStack(S);
Push(S,0);
Push(S,1);
Push(S,2);
Push(S,3);
PrintStack(S);
printf("出栈操作\n");
Pop(S,e);
GetTop(S,e);
printf("取得栈顶元素:%d \n",e);
Pop(S,e);
GetTop(S,e);
printf("取得栈顶元素:%d \n",e);
}
栈的顺序存储
最新推荐文章于 2020-11-11 15:45:32 发布