顺序栈的结构定义: #define STACK_INIT_SIZE100;/存储空间初始分配量 #define STACKINCREMENT1O;//存储空间分配增量 typedef struct SElemType *base; /存储空间基址 SElemType *top; /栈顶指针 int stacksize; /当前已分配的存储空间 }SqStack; >Stacksize:栈的当前可使用的最大容量; >Base:栈底指针,顺序栈中始终指向栈底位置,base的 值为NULL,则表明栈结构不存在; >Top:栈顶指针,初值指向栈底,当top=base时,可以以 作为栈空的标记。非空栈中to指针始终在栈顶元素的下一 个位置
顺序栈的结构定义: #define STACK_INIT_SIZE 100; // 存储空间初始分配量 #define STACKINCREMENT 10; // 存储空间分配增量 typedef struct { SElemType *base; // 存储空间基址 SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间 } SqStack; ➢Stacksize:栈的当前可使用的最大容量; ➢Base:栈底指针,顺序栈中始终指向栈底位置,base的 值为NULL,则表明栈结构不存在; ➢Top:栈顶指针,初值指向栈底,当top=base时,可以以 作为栈空的标记。非空栈中top指针始终在栈顶元素的下一 个位置
栈满 栈空 top top top 5 top F top E top 4 4 3 top D 3 top 3 2 top top C 2 2 top top B top A 0 top=0 栈空 进栈 出栈 进栈:top加1 出栈: top减1 设数组大小为M 栈顶指针top,指向实际栈顶 top=O,栈空,此时出栈,则下溢(underflow) 后的空位置,初值为0 top=M,栈满,此时入栈,则上溢(overflow)
top=0 1 2 3 4 5 0 栈空 栈顶指针top,指向实际栈顶 后的空位置,初值为0 top 1 2 3 4 5 0 进栈 A top 出栈 栈满 B C D E F 设数组大小为M top=0,栈空,此时出栈,则下溢(underflow) top=M,栈满,此时入栈,则上溢(overflow) top top top top top 1 2 3 4 5 A 0 B C D E top F top top top top top 栈空 进栈:top加1 出栈:top减1
顺序栈的基本操作: void InitStack(SqStack&S);l∥构造一个空栈s。 void DestroyStack(SqStack&S);I销毁栈s,s不再存在。 void ClearStack(SqStack&S);l/将s置为空栈。 bool StackEmpty(SqStack S);l若栈s为空栈。 int StackLength(SqStack S);l∥返回S的元素个数,即栈的长度。 bool GetTop(SqStack S,SElemType&e;l若栈不空,则用e返回s的 栈顶元素,并返回TRUE;否则返回FALSE。 bool Push(SqStack&S,SElemType e);∥若栈的存储空间不满,则插入 元素e,并返回TRUE;否则返回FALSE。 bool Pop(SqStack&S,SElemType&e);∥若栈不空,则删除s的栈顶元 素,用e返回其值,并返回TRUE;否则返回FALSE。 void StackTraverse(SqStack S,Status(visit);l依次对s的每个元 素调用函数visit(),一旦visit()失败,操作失败
顺序栈的基本操作: void InitStack (SqStack &S); //构造一个空栈S。 void DestroyStack (SqStack &S); //销毁栈S,S 不再存在。 void ClearStack (SqStack &S); //将 S 置为空栈。 bool StackEmpty (SqStack S); //若栈 S 为空栈。 int StackLength (SqStack S); //返回S的元素个数,即栈的长度。 bool GetTop (SqStack S, SElemType &e); //若栈不空,则用 e 返回S的 栈顶元素,并返回TRUE;否则返回 FALSE。 bool Push (SqStack &S, SElemType e); //若栈的存储空间不满,则插入 元素 e ,并返回 TRUE;否则返回FALSE。 bool Pop (SqStack &S, SElemType &e); //若栈不空,则删除S的栈顶元 素,用e返回其值,并返回TRUE;否则返回FALSE。 void StackTraverse(SqStack S, Status (*visit()); //依次对S的每个元 素调用函数visit( ),一旦 visit( )失败,操作失败
栈的初始化 Status InitStack(SqStack &S){ ∥构造一个空栈S S.base=(SElemType *)malloc (STACK_INIT_SIZE*sizeof(SElemType)); ifIS.base)exit(OVERFLOW);∥存储分配失败 S.top S.base; S.stacksize=STACK INIT SIZE; return OK; }//InitStack
1 栈的初始化 Status InitStack (SqStack &S){ // 构造一个空栈 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; } //InitStack
2 取栈顶元素 Status GetTop(SqStack S,SElemType &e) {∥若栈不空,则用e返回S的栈顶元素,并返回OK if(S.top==S.base)return ERROR;∥空栈 e=*(S.top-1)月 ∥返回非空栈中栈顶元素 return OK; }//GetTop 注意: top栈顶指针始终在栈顶元素的下一个位置上
2 取栈顶元素 Status GetTop (SqStack S, SElemType &e) { // 若栈不空,则用 e 返回S的栈顶元素,并返回OK if (S.top == S.base ) return ERROR; // 空栈 e = *(S.top-1); // 返回非空栈中栈顶元素 return OK; } //GetTop 注意: top栈顶指针始终在栈顶元素的下一个位置上