栈(stack)
定义:限定仅在表尾进行插入与删除操作的线性表。
栈的操作特点:就是后进先出(Last in First out ).
(1) 栈顶(top):允许插入语删除的一端。
(2) 栈底(base):位于栈的底部,固定不动。
栈的插入操作,称为进栈,入栈。
栈的删除操作,成为出栈,弹栈。如图:
实现代码:
typedef int SElemType;
typedef int Status;
typedef struct SqStack
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status Visit(SElemType s)
{
printf("%3d",s);
return OK;
}
/*
****操作结果:初始化空栈
*/
Status InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(StackSize*sizeof(SElemType));
if(!S->base)
exit(OVERFLOW);
S->top = S->base;
S->stacksize = StackSize;
return OK;
}
/*
*****初始条件:栈S已经存在
*****操作结果:若S为空,返回1,否则S不空,返回0
*/
Status EmptyStack(SqStack S)
{
if(S.base == S.top)
return TRUE;
else
return FALSE;
}
/*
*****初始条件:栈S已经存在
*****操作结果:栈S被置为空栈
*/
Status ClearStack(SqStack *S)
{
if(S->top == S->base)
printf("栈已为空栈\n");
else
S->top = S->base;
return OK;
}
/*
****初始条件:栈S已经被初始化
****操作结果:插入元素 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)
exit(OVERFLOW);
S->top = S->base + S->stacksize;
S->stacksize += StackIncrement;
}
*(S->top++) = e;
return OK;
}
/*
****初始条件:栈S已经存在
****操作结果:用e返回栈顶元素,并返回OK,否则返回ERROR
*/
Status GetTop(SqStack *S,SElemType *e)
{
if(S->top == S->base)
return ERROR;
S->top--;
*e = *(S->top);
return OK;
}
/*
****总结:注意与GetTop()的区别,最重要的区别就是:都用到 (SElemType *e)而不是(SElemType e)
**** 因为*e 为地址传递。e 为值传递。但是在main()中,没有对e初始化。而且
**** e 是用来存储 栈顶元素的。不应该被初始化。故应该采用地址传递方式即 *e.
**** 直接对e进行操作。
*/
Status GetTop1(SqStack S,SElemType *e)
{
if(S.top == S.base)
return ERROR;
S.top--;
*e = *S.top;
return OK;
}
/*
****初始条件:栈S已经存在
****操作结果:若栈不空,则删除栈顶元素,并用e 返回其值,并返回OK;否则返回ERROR
*/
Status Pop(SqStack *S,SElemType *e)
{
if(S->top == S->base) //栈空。
return ERROR;
*e = *(--S->top);
return OK;
}