一、栈的定义;
——栈(Stack)是一种后进先出(Last in first out,LIFO)的线性表,它要求只在表尾进行删除和插入操作。
对栈来说,这个表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)
——栈的插入操作(Push),叫做进栈,也称为压栈,入栈。
——栈的删除操作(Pop),叫做出栈,弹栈。
二、栈的顺序存储结构
不含任何数据的栈叫做空栈,此时栈顶就是栈底,数据从栈顶进入,从栈顶弹出。
栈的定义:
typedef struct
{
ElemType *base;//base是指向栈底的指针变量
ElemType *top;//top是指向栈顶的指针变量
int stackSize;//stackSize是指示栈的当前可使用的最大容量
}sqStack;
创建一个栈:
#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,直到栈满为止。
#define STACKINCREMENT 10
Push(sqStack *s,ElemType e)
{
//如果栈满,追加空间
if(s->top - s->base >= s->stackSize)
{
s->base = (ElemType *)realloc
(s->base,(s->stackSize + STACKINCREMENT)*sizof(ElemType));
if(!s->base)
exit(0);
s->top = s->base + s->stackSize;//设置1栈顶
s->stackSize = s->stacjSize + STACKINCREMENT;//设置栈的最大1容量
}
*(s->top) = e;
s->top++;
}
出栈操作:
在栈顶取出数据,栈顶指针随之下移操作,每当栈内弹出一个数据,栈的当前容量-1
Pop(sqStack *s,ElemType *e)
{
if(s->top == s->base)//栈已经空了
retuen;
*e = *--(s->top);
}
三、栈的链式存储结构
teypedef struct StackNode
{
ElemType data;//存放栈的数据
struct StackNode *next;
}
StackNode, *LinkStackPtr;
teypedef struct LinkStack
{
LinkStackPrt top;//top指针
int count;//栈元素计数器
}
入栈操作:
Status Push(LinkStack *s,ElemType e)
{
LinkStackPtr p = (LinkStackPtr) malloc
(sizeof(StackNode));
p->data = e;
p->next = s->top;
s->top = p;
s->count++;
return OK;
}
出栈操作:
Status Push(LinkStack *s,ElemType e)
{
LinkStackPtr p;
if(StackEmpty(*s))//判断是否为空栈
return ERROR;
*e = s->top->data;
p = s->top;
s->top = s->top->next;
free(p);
s->count--;
return OK;
}