1、栈(Stack):是一种特殊的线性表(数据元素之间的关系是线性关系),其插入、删除只能在表的一端进行,另一端固定不动。
2、术语:
栈顶(top):插入、删除的一端;
栈底(bottom):固定不动的一端;
入栈(push):又称压入,即插入一个元素;
出栈(pop):又称弹出,即删除一个元素;
3、栈的操作
1)栈初始化Inistack(s):将栈置为空;
2)入栈Push(s):即在栈顶插入一个元素;
3)出栈Pop(s):即在栈顶删除一个元素;
4)取栈顶元素Get_top(s):访问栈顶元素;
5)判断栈是否空Empty(s):判断是否为空;
6)求栈的大小Current_size(s):求栈中元素个数;
7)栈清空Clear(s):将栈清为空;
4、栈的ADT描述
ADT Stack{ data structure: D={ai|ai∈D0 i=1,2,... n>=0} R={N} N={<ai-1,ai>|ai-1,ai∈D0 i=2,3,4,...} D0是某个对象 operations: Initiate(S);Push(S);Pop(S);Get_top(S); Empty(S);Current_size(S);Clear(S); }ADT Stack
5、存储方式:同一般线性表的顺序存储结构完全相同。但是栈底可以在地址低端,也可以在地址高端。
栈的顺序存储结构的特点:简单,方便,但易产生溢出。
上溢(overflow):栈已经满,又要压入元素;
下溢(Underflow):栈已经空,还要弹出元素;
注:上溢是一种错误,使问题的处理无法进行下去;而下溢一般认为是一种结束条件,即问题处理结束。
6、虑拟实现:
#define STACK_INIT_SIZE 100; #define STACKINCREMENT 10; typedef struct { SElemType *base; //在栈构造之前和销毁之后,base=NULL SElemType *top;//栈顶指针 int stacksize; }SqStack;
7、操作
1)栈初始化
Status InitStack(SqStack &S) { S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)) if(!S.base)exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; }
2)入栈 //在栈顶插入新元素,要考虑上溢的处理
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; reutrn OK; }
3)出栈//若栈不空,则删除S的栈顶元素,用e返回其值
Status Pop(SqStack &S, SElemType &e) { if(S.top==S.base) return ERROR; e=*--S.top; return OK; }
4)判断栈是否空
Status StackEmpty(SqStack S) { if(S.top=S.base) return TRUE; else return FALSE; }
5)取栈顶元素
Status GetTop(SqStack S, SElemType &e) { //若栈不空,用e返回栈顶元素 if(S.top==S.base) return ERROR; e=*(S.top-1); return OK; }
原文:http://www.cnblogs.com/shamoof/p/3662386.html