栈(或称堆栈): 是一种仅允许在一端进行插入和删除运算的线性表, 遵循后进先出(Last In First Out,LIFO)的原则。
栈顶:栈中可以进行插入和删除的那一端,即线性表的表尾。
栈底:栈中不可以进行插入和删除的那一端,即线性表的表头。
进栈(或称入栈、压栈):向一个栈插入新元素,即把新元素放到栈顶元素的上面,使其成为新的栈顶元素。
出栈(或称退栈):一个栈删除元素,即把栈顶元素删除掉,使其下面相邻的元素成为新的栈顶元素。
栈顶:栈中可以进行插入和删除的那一端,即线性表的表尾。
栈底:栈中不可以进行插入和删除的那一端,即线性表的表头。
进栈(或称入栈、压栈):向一个栈插入新元素,即把新元素放到栈顶元素的上面,使其成为新的栈顶元素。
出栈(或称退栈):一个栈删除元素,即把栈顶元素删除掉,使其下面相邻的元素成为新的栈顶元素。
存储结构:有顺序存储和链接存储两种结构,链接存储的栈叫链栈。
头文件
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define STACK_INIT_SIZE 10//存储空间初始分配量
#define STACKINCREMENT 2//存储空间分配增量
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
typedef int Status ;
typedef int SElemType;
typedef struct stack{
SElemType *base;
SElemType *top;
int stacksize;//当前已分配的存储空间
}SqStack;
/*构造一个空栈S*/
Status InitStack(SqStack *s);
/*销毁栈S*/
Status DestroyStack(SqStack *s);
/*将S清为空栈*/
Status ClearStack(SqStack *s);
/*判断栈S是否是空栈*/
Status StackEmpty(SqStack s);
/*返回栈S的元素个数*/
int StackLength(SqStack s);
/*用e返回S的栈顶元素*/
Status GetTop(SqStack s, SElemType *e);
/*插入元素e为新的栈顶元素*/
Status Push(SqStack *s, SElemType e);
/*删除S的栈顶元素,并用e返回其值*/
Status Pop(SqStack *s, SElemType *e);
/*遍历栈,打印出元素*/
Status StackTraverse(SqStack s,void (*vist)());
源文件
/*构造一个空栈S*/
Status InitStack(SqStack *s)
{
(*s).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if (!s->base)
{
exit(-1);
}
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
/*销毁栈S*/
Status DestroyStack(SqStack *s)
{
free(s->base);
s->base=NULL;
s->top=NULL;
s->base=0;
return OK;
}
/*将S清为空栈*/
Status ClearStack(SqStack *s)
{
s->top=s->base;
return OK;
}
/*判断栈S是否是空栈*/
Status StackEmpty(SqStack s)
{
if (s.base==s.top)
{
return TRUE;
}
else
{
return FALSE;
}
}
/*返回栈S的元素个数*/
int StackLength(SqStack s)
{
return s.top-s.base;
}
/*用e返回S的栈顶元素*/
Status GetTop(SqStack s, SElemType *e)
{
if (StackEmpty(s))
{
return ERROR;
}
else
{
*e=*(s.top-1);
return OK;
}
}
/*插入元素e为新的栈顶元素*/
Status Push(SqStack *s, SElemType e)
{
if ((*s).top-(*s).base>=(*s).stacksize)/*栈满,追加空间*/
{
(*s).base=(SElemType *)realloc((*s).base,((*s).stacksize+STACKINCREMENT)*sizeof(SElemType));
if (s->base==NULL)
{
exit(OVERFLOW);//存储分配失败
}
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top)++=e;
return OK;
}
/*删除S的栈顶元素,并用e返回其值*/
Status Pop(SqStack *s, SElemType *e)
{
if (StackEmpty(*s))
{
return ERROR;
}
else
{
*e=*--s->top;
}
return OK;
}
/*遍历栈,打印出元素*/
Status StackTraverse(SqStack s,void (*vist)())
{
while(s.top>s.base)
{
vist(*s.base++);
}
printf("\n");
return OK;
}
void print(SElemType i)
{
printf("%d ",i);
}
主程序及程序运行结果
int main()
{
int i;
SElemType val;
SElemType Item;
SqStack s;
InitStack(&s);
printf("0-9依次入栈并输出:\n");
for(i=0;i<10;i++)
{
Push(&s,i);
GetTop(s,&val);
printf("%d ",val);
}
printf("\n");
printf("\n");
if(StackTraverse(s,print))
{
printf("遍历栈成功!\n");
}
printf("\n栈中元素依次出栈并输出如下:\n");
for(i=0;i<10;i++)
{
Pop(&s,&Item);
printf("%d ",Item);
}
printf("\n");
ClearStack(&s);
if(StackEmpty(s))
printf("\n栈置空成功\n");
if(DestroyStack(&s))
printf("栈已被销毁\n");
return 0;
};