标签:
(1) 栈的定义
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
(2) 抽象数据类型
ADT 栈(stack)
Data
同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
initStack(&S):初始化操作,建立一个空栈S。
destoryStack(&S):若栈存在,则销毁它。
clearStack(&S):将栈清空。
stackEmpty(S):若栈为空,返回true,否则返回false。
getTop(S, &e):若栈存在且非空,用e返回S的栈顶元素。
push(&S, e):若栈S存在,插入新元素e到栈S中并成为栈顶元素。
pop(&S, &e):删除栈S中栈顶元素,并用e返回其值。
stackLength(S):返回栈S的元素个数。
endADT
(1) 栈的顺序存储结构
#define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 typedef struct { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 } SqStack;
(2) 基本操作
初始化一个空栈:
Status initStack(SqStack &S) // 构造一个空栈 { S.base = (SElemType *) malloc (STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) return ERROR; S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }
取栈顶元素操作:
Status getTop(SqStack S, SElemType &e) { if (S.top == S.base) return ERROR; e = *(S.top - 1); return OK; }
进栈操作:
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) return ERROR; S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; }
出栈操作
Status pop(SqStack &S, SElemType &e) { if (S.top == S.base) return ERROR; e = *(--S.top); return OK; }
关键思路是:它们是在数组的两端,向中间靠拢。top1和top2是栈1和栈2的栈顶指针,可以想象,只要它们俩不见面,两个栈就可以一直使用。
事实上,使用这样的数据结构,通常都是当两个栈的空间需求有相反关系时,也就是一个增长时另一个栈在缩短的情况下。否则两个栈都在不停地增长,那很快就会因栈满而溢出了。
当然,这只是针对两个具有相同数据类型的栈的一个设计上的技巧,如果是不同数据类型的栈,这种办法不但不能更好地处理问题,反而会使问题变得更复杂,大家要注意这个前提。
(1) 空间结构
(2) 进栈、出栈操作
(1) 栈的链式存储结构
(2) 基本操作
标签:
原文地址:http://www.cnblogs.com/xiaoxxmu/p/5589714.html