栈
栈(stack)是一种只能在一端进行插入或删除操作的顺序表。
表中允许进行插入、删除操作的一端称为栈顶(top),表的另一端称为栈底(bottom)。
栈的主要特点是“后进先出”,所以也称为后进先出表。
栈抽象数据类型=逻辑结构+基本运算
例题:给定一个进栈序列看是否能够得到给定的出栈序列
思路:不管第一个出栈序列为什么,直接看第二个出栈元素,如果后一个比前一个大,不用管直接往后看;如果后一个比前一个小,就看这个和前一个出栈元素中间有没有没出栈的元素,如果不存在证明此此序列可出栈,如果存在还没出栈的元素则不可出栈。
比如 进栈序列为1,2,3,4,则3142不能作为出栈序列。因为1比三小且1和3中间的2还没有出栈,所以不可以。
顺序栈
采用顺序结构存储的栈称为顺序栈(sequential stack)。
需要定义一个栈顶指针来存放栈顶元素在data数组中的下标。
代码:typedef struct
{ ElemType data[MaxSize];
int top; //栈顶指针
} Sqstack; //顺序栈的类型
定义一个顺序栈s,初始时设置s->top=-1,以下是顺序栈的算法设计非常重要的4个要素
1. 栈空的条件:s->top==-1
2. 栈满的条件: s->top==MaxSize-1
3. 元素e的进栈操作: 先将栈顶指针top增1,然后将元素e放在栈顶指针处
3. 出栈操作: 先将栈顶指针top处的元素取出放在e中,然后将栈顶指针减1
链栈
采用链式存储结构的栈称为链栈(linked stack)
链栈的有点是不存在栈满上溢出的情况
链栈中结点类型LinkStNode的声明如下:
代码:typedef struct linknode
{ ElemType data; //数据域
struct linknode * next; //指针域
} LinkStNode; //链栈结点的类型
定义以s为头结点指针的链栈,以下是链栈的算法设计非常重要的4个要素
1. 栈空的条件:s->next==NULL
2. 栈满的条件:由于只有内存溢出时才出现栈满,所以在链栈中不考虑栈满的情况
3. 元素e的进栈操作:新建一个结点存放元素e(由p指向它),将结点p插入到头结点之后
3. 出栈操作: 取出首结点的data值并将其删除