1. 栈的定义
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。
栈又被称为后进先出(Last in First out)的线性表,简称LIFO结构。
2. 栈的操作
栈的插入操作,称为进栈,也称为压栈、入栈;
栈的删除操作,称为出栈,也叫做弹栈;
3. 栈的定义
typedef int SElemType;
typedef struct {
SElemType data[MAX_SIZE];
int top;
}SqStack;
4. 栈的顺序存储结构——进栈
Status Push(SqStack *S, SElemType e)
{
if (S->top == MAX_SIZE - 1) //栈满
{
return ERROR;
}
S->top++; //栈顶指针加1
S->data[S->top] = e; //新插入的元素赋值给栈顶空间
return OK;
}
5. 栈的顺序存储结构——出栈
Status Pop(SqStack *S, SElemType *e)
{
if (S->top == - 1) //栈空
{
return ERROR;
}
*e = S->data[S->top]; //将要删除的栈顶指针赋值给e
S->top--; //栈顶指针减一
return OK;
}
6. 两栈共享空间
前提: 两个具有相同数据类型的栈。
优点:节省存储空间。
特点:数组有两个端点,两个栈有两个栈底,一个栈的栈底为数组的始端,即下标为0处;另一个为数组的末端,下标为数组长度n-1出。两个栈如果增加元素,就是两端点向中间延申。
6.1 空间结构
typedef struct {
SElemType data[MAX_SIZE];
int top1; //栈1的栈顶指针
int top2; //栈2的栈顶指针
};
6.2 入栈
Status Push(SqDoubleStack *S, SElemType e, int type) //type用来区分栈1还是栈2
{
if (S->top1 + 1 == S->top2) //栈满
return ERROR;
if (type == 1) //栈1有元素入栈
{
S->data[++S->top1] = e; //top1 + 1后给数组赋值
}
else if (type == 2) //栈2有元素入栈
{
S->data[--S->top2] = e; //top2 - 1后给数组赋值
}
return OK;
}
6.3 出栈
Status Pop(SqDoubleStack *S, SElemType *e, int type) //type用来区分栈1还是栈2
{
if (type == 1)
{
if (S->top1 == -1) //栈1为空
{
return ERROR;
}
*e = S->data[S->top1--]; //将栈1的栈顶元素出栈
}
else if (type == 2)
{
if (S->top2 == MAX_SIZE) //栈2为空 溢出
{
return ERROR;
}
*e = S->data[S->top2++]; //将栈2的栈顶元素出栈
}
return OK;
}