栈的定义和抽象数据类型
栈是限定仅在表尾进行插入和删除操作的线性表。所以说栈也是线性表,栈元素具有线性关系,即前驱后继关系。
其抽象数据类型:
ADT 栈(Stack) Data 同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。 Operation InitStack(*S): 初始化操作,建立一个空栈S。 DestroyStack(*S): 若栈存在,则销毁它。 ClearStack(*S): 将栈清空。 StackEmpty(S): 若栈为空,返回true,否则返回false。 GetTop(S,*e): 若栈存在且非空,用e返回S的栈顶元素。 Push(*S,e): 若栈存在,插入新元素e到栈S中并成为栈顶元素。 Pop(*S,*e): 删除栈S中栈顶元素,并用e返回其值。 StackLength(S): 返回栈S中元素个数。 endADT
既然栈是顺序表的特例,那么先来看栈的顺序存储结构:顺序栈。定义一个top变量来指示栈顶元素在数组中的位置。既然top是数组的下标那么top的范围就是top属于[0, StackSize-1]。所以当栈存在一个元素的时候,top等于0,因此通常把空栈的判定条件定为top等于-1。
若存在一个栈,StackSize是5,三种情况的示意图:
栈的顺序存储结构的实现
#include <iostream> #include <stdlib.h> using namespace std; #define MAXSIZE 20 typedef int SElemType; typedef struct { SElemType data[MAXSIZE]; int top;//栈顶指针 }SqStack; /*初始化一个空栈*/ bool InitStack(SqStack *s) { s->top = -1; return true; } /*将栈清空*/ bool ClearStack(SqStack *s) { s->top = -1; return true; } /*判断栈是否为空*/ bool IsStackEmpty(SqStack s) { if(s.top == -1) { return true; } else { return false; } } /*返回栈中元素的个数*/ int StackLength(SqStack s) { cout << "Stack Length : "; return s.top + 1; } /*获取栈顶元素*/ bool GetTop(SqStack s, SElemType *e) { if(s.top != -1) { *e = s.data[s.top]; return true; } cout << "Get Top Item " << *e << endl; return false; } /*插入新元素到栈中,并成为栈顶元素*/ bool Push(SqStack *s, SElemType e) { cout << "Push Item " << e << endl; if(s->top == MAXSIZE - 1) { return false; } s->top++; s->data[s->top] = e; return true; } /*删除栈顶元素,用e返回取值*/ bool Pop(SqStack *s, SElemType *e) { if(s->top == -1) { return false; } *e = s->data[s->top]; s->top--; cout << "Pop Item " << *e << endl; return true; } /*遍历栈中的元素,这个方法不是栈的操作,只是调试的时候观察数据*/ bool StackTraverse(SqStack s) { cout << "Traverse Stack ..." << endl; if(s.top == -1) { return false; } for(int i = s.top; i >=0; i--) { cout << s.data[i] << ' '; } cout << endl; return true; } void main(void) { SqStack sqStack; InitStack(&sqStack); for(int i = 0; i < 10; i++) { Push(&sqStack, i); } StackTraverse(sqStack); int result; Pop(&sqStack, &result); StackTraverse(sqStack); GetTop(sqStack, &result); if(!IsStackEmpty(sqStack)) { cout << StackLength(sqStack) <<endl; } ClearStack(&sqStack); system("pause"); }
执行结果: