栈的定义:栈(Stack)是一个先进后出(First in last out, FILO)的线性表,它要求只在表尾进行删除和插入操作
栈的特点:
1、栈遵循现金后出的原则
2、栈的删除、插入等操作在表尾进行
3、栈的表尾叫做栈顶(top),表头叫栈底(bottom)
栈的插入和删除操作:
栈的插入操作(Push),叫做进栈,也称压栈,入栈;
栈的删除操作(Pop),叫做出栈,也称弹栈;
栈的顺序存储结构:
最开始栈中不含任何数据,叫做空栈,此时栈顶就是栈底;
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
这是栈的顺序存储结构,栈的顺序存储结构包含三个元素:base指向栈底的指针变量,top指向栈顶的指针变量,satckSize栈当前可使用的最大容量
创建一个栈:
#define STACK_INIT_SIZE 100
initStack(sqStack *s)
{
s -> base = (Elemtype*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!s -> base)//申请空间失败
exit(0);
s -> top = s ->base;//最开始,栈顶就是栈底(空栈)
s -> stackSize = STACK_INIT_SIZE;
}
入栈操作:
入栈操作就是向栈中插入数据,入栈操作在栈顶进行,向栈中压入一个数据,top指针就加1,直到栈满;
代码实现(Push.c):
#define SATCKINCREMENT 10
Push(sqStack *s, ElemType e)
{ //如果栈满追加空间
if(s -> top – s ->base >= s -> stackSize)
{
s -> base = (ElemType *)malloc(s ->base, (s -> stackSize + STACKINCREMENT) * sizeof(ElemType));
if(!s -> base)
exit(0);
s -> top = s -> base +s -> stackSize;//设置栈顶
s -> stackSize = s ->stackSize + STACKINCREMENT;//设置栈的最大容量
}
*(s -> top)= e;
s -> top++;
}
出栈操作:
出栈操作就是在栈顶取出数据,栈顶指针下移,栈的当前容量就减1;
代码实现:
pop(sqStack *s, ElemType *e)
{
if(s -> top == s ->base)//栈为空
return;
*e = * --(s -> top);//指针top先减1,然后取出内容(top指向的栈顶没有元素)
}