栈
栈:限定仅在表尾进行插入或删除操作的线性表,表尾称为栈顶,表头称为栈底,不含元素的空表称为空栈。
栈又被称为后进先出的线性表(简称LIFO结构)
顺序栈
栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
下面为顺序栈的实现,包括操作:初始化栈、销毁栈、置空栈、判断栈空、栈元素个数、获取栈顶元素、入栈、出栈、遍历栈中元素
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 10 //存储空间初始分配量
#define STACK_INCREMENT 2 //存储空间分配增量
//栈的顺序存储结构
typedef struct Stack
{
int *base; //在栈构造之前和销毁之后,base的值为NULL
int *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}STACK,*PSTACK; //顺序栈
void Init(PSTACK pS); //构造一个空栈
void Destroy(PSTACK pS);//销毁栈
void Clear(PSTACK pS); //将栈置空
bool Empty(PSTACK pS); //判断栈是否为空
int Length(PSTACK pS); //返回栈的长度
bool GetTop(PSTACK pS,int *e); //用e返回栈顶元素
void Push(PSTACK pS,int e); //入栈(压栈)
bool Pop(PSTACK pS,int *e); //出栈(弹栈)
void Traverse1(PSTACK pS); //遍历栈中的元素(从栈顶到栈底)
void Traverse2(PSTACK pS); //从栈底到栈顶
int main()
{
int val,i;
STACK S;
Init(&S);
for(i = 1;i < 8;i++)
{
printf("进栈的元素为:%d\n",i);
Push(&S,i);
}
Traverse2(&S);
Pop(&S,&val);
printf("出栈的元素为%d\n",val);
Traverse2(&S);
printf("\n栈中的元素个数为:%d\n",Length(&S));
GetTop(&S,&val);
printf("栈顶元素为:%d\n",val);
Clear(&S);
printf("栈已置空!\n");
if(Empty(&S))
printf("栈为空!\n");
else
printf("栈不空!\n");
Destroy(&S);
printf("栈已销毁!\n");
printf("销毁栈后,S.top=%d S.base=%d S.stacksize=%d\n",S.top,S.base, S.stacksize);
return 0;
}
void Init(PSTACK pS)
{
pS->base=(int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(pS->base==NULL)
exit(-1);
pS->top=pS->base;
pS->stacksize=STACK_INIT_SIZE;
}
void Destroy(PSTACK pS)
{
pS->base=NULL;
pS->top=NULL;
pS->stacksize=0;
}
void Clear(PSTACK pS)
{
pS->top=pS->base;
}
bool Empty(PSTACK pS)
{
if(pS->base==pS->top)
return true;
else
return false;
}
int Length(PSTACK pS)
{
return pS->top-pS->base;
}
bool GetTop(PSTACK pS,int *e)
{
if(Empty(pS))
return false;
*e=*(pS->top-1);
return true;
}
void Push(PSTACK pS,int e)
{
if(pS->top-pS->base>=pS->stacksize) //栈满,追加存储空间
{
pS->base=(int *)realloc(pS->base,sizeof(int)*(STACK_INIT_SIZE+STACK_INCREMENT));
if(pS->base==NULL)
exit(-1);
pS->top=pS->base+pS->stacksize;
pS->stacksize+=STACK_INCREMENT;
}
*(pS->top)++=e;
}
bool Pop(PSTACK pS,int *e)
{
if(Empty(pS))
return false;
*e=*--(pS->top);
return true;
}
void Traverse1(PSTACK pS)
{
int *p = pS->top;
while(p!=pS->base)
{
p--;
printf("%d ",*p);
}
printf("\n");
}
void Traverse2(PSTACK pS)
{
int *p=pS->base;
while(p!=pS->top)
{
printf("%d ",*p);
p++;
}
printf("\n");
}