栈是限定仅在表尾进行插入或者删除操作的线性表。因此,对栈来说,表尾端有特殊含义,称为栈顶,表头端为栈底。不含元素的空表称为空栈。栈的主要特点就是后进先出(LIFO);
栈的表示和实现
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。通常的习惯做法以top=0表示空栈。一般来说,在初始化设空栈时不应限定栈的最大容量。一个较合理的做法:先为栈分配一个基本容量,然后在应用过程中,当栈的空间不足在进行扩展。
以下是栈的顺序存储表示
#define STACK_INIT_SIZE 100 //定义栈的大小为100
#define STACKINCREMENT 10 // 存储空间分配增量
typedef struct SqStack //typedef函数代表是为创建结构体,即用sqstack代替struct
{
int *base; //定义栈底指针
int *top; //定义栈顶指针
int stacksize; //定义栈的长度
}SqStack;
int InitStack(SqStack &S) //形参中&表引用,不然的话&加变量==取地址
{
S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); //malloc函数申请STACK_INIT_SIZE的空间大小
if(!S.base)
exit(0); //如果内存申请失败,则返回0
S.top=S.base; //先让栈顶与栈底重合
S.stacksize=STACK_INIT_SIZE; //大小就是与开头定义的一样大
return 0;
}
int GetTop(SqStack S,int &e) //返回栈顶元素,形参有栈名和引用变量e
{
if(S.top==S.base) //说明栈底和栈顶一样,说明栈空
return 1;
e=*(S.top-1); // 这里的栈是在栈顶的上一个,参考下面!!!!!!
return 0;
}
int Push(SqStack &S,int e) //进栈函数 形参有栈还有变量e
{
if(S.top-S.base>=S.stacksize) //如果栈顶-栈底=栈长度说明满了
{
S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));//重新分配增量的空间
if(!S.base) //如果仍然分配错误,则返回1
return 1;
S.top=S.base+S.stacksize; //使栈顶==原来的栈底加栈长度
S.stacksize+=STACKINCREMENT; /新栈长度=原来的加上增量长度
}
*S.top=e; //加入新元素
S.top++; //栈再加1!!!!!!
return 0;
}
int Pop(SqStack &S,int &e) //退栈一个
{
if(S.top==S.base) //如果栈空,返回1
return 1;
--S.top; //不然的话,栈退一格指到栈顶元素
e=*S.top; //e就是被退出的那个栈顶元素
return 0;
}
int StackEmpty(SqStack S) //判断栈是否为空的函数
{
if(S.top==S.base)
return 1;
return 0;
}
int DestroyStack(SqStack &S) //清空栈的函数
{
free(S.base); //free函数表示释放内存
S.top=NULL;
S.base=S.top;
return 0;
}