1.定义
栈是一种特殊的线性表。其特殊性在于限定只能在表尾进行插入和删除数据元素的操作。如下所示:
(1)结论:后进先出(Last In First Out),简称为LIFO线性表。
(2)栈顶(top):允许删除和插入操作的一端,另一端称为栈底(button)。
2.抽象数据类型
(1)进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素。
(2)出栈: Pop(S) 、 可形象地理解为弹出,弹出后栈中就无此元素了。
3.栈的顺序存储(栈的数组实现)
(1)数组下标为0的一端作为栈底
(2)top变量作为栈顶元素在数组里的位置,top必须小于储存栈的长度 Stacksize.
(3)空栈的判断条件为top = -1
(4)栈的结构定义
typedef int SElemtype;/*SElemtype的类型根据情况来定义*/
typedef struct
{
SElemtype date[MAXSIZE];
int top;/*用于栈顶指针*/
}SqStact;
(5)栈的进栈操作
/*插入元素e为新的栈顶元素*/
Status Push (SqStack *S, SElemtype e)
{
if (S-> top == MAXSIZE - 1)/*栈满*/
{
return ERROR;
}
S->top++;/*栈顶指针加一*/
S->date[S->top] = e;/*将新元素插入栈顶空间*/
return OK;
}
(6)栈的出栈操作
/*若栈不空,则删除栈顶的元素,用e返回其值,并返回OK;否贼返回ERROR*/
Status Pop(SqStack *S, SElemtype *e)
{
if(S->top == -1)
return ERROR;
* e = S->date[top];
* S->top --;
return ok;
}
4.两栈共享空间
(1)数组有两个端点,两个相同数据类型的栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈为数组的末端,即下标为数组长度 n - 1处,这样,两个栈如果增加元素,就是两蹲点向中间延伸。
Status Push (SqDoubleStack *s, SqElemtype e, int stacknumber)
{
if(s->top1 + 1 == s->top2)
{
return ERROR;
}
if(stacknumber == 1)
s->date[++s->top1] = e;
if(stacknumber == 2)
s->date[- -s->top2] = e;
return OK;
}
5.栈的链式存储结构
(1)