1、简介:
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
术语解释:
栈顶(Top) :允许数据插入和删除的端,即栈的顶端。
栈底(Bottom):固定并且不允许进行插入和删除操作的一端,即栈底。
栈空:即不含有任何元素的栈。
进栈、入栈或压栈:数据进入栈。
出栈或退栈:数据出栈
2、链式栈的基本操作
链式栈
2.1、初始化一个栈
void initStack(struct Stack *ps)//初始化一个栈
{
//将栈顶指向头指针,ps->pTopZ这是个指针用于存放地址
ps->pTop=(struct Node*)malloc(sizeof(struct Node));
if(NULL==ps->pTop) //判断分配是否成功
{
printf("动态内存分配失败");
exit(-1);
}
else
{
ps->PBottom=ps->pTop;//栈底和栈顶都指向头指针
ps->PBottom->pNext=NULL;//将指针域清空
}
}
2.2、进栈
int pushStack(struct Stack *ps,int i)
{
struct Node *pNew=(struct Node*)malloc(sizeof(struct Node));//造一个新的指针指向一个节点
pNew->date=i;//将数据存入新的节点的数据域中
pNew->pNext=ps->pTop;//把前一个节点的地址(ps->pTop存放地址),赋给后一个节点的指针域。所以后一个节点指向前一个节点
ps->pTop=pNew;//在把新的节点的地址付给ps->pTop
}
2.3、出栈
bool pop(struct Stack *ps,int *pval)//把ps指向的栈出栈一次,并把出栈的元素存入pval中
{
if(empty(ps))//如果为空直接出栈
{
return false;
}
else
{
struct Node *r=ps->pTop;//将栈顶的地址付给方便不需要的空间释放
*pval=r->date;//把出栈的值存放,方便操作
ps->pTop=r->pNext;
free(r);//把r指向的空间释放
r=NULL;
return true;
}
}
2.4、遍历一个栈
void traverseStack(struct Stack *ps)
{
struct Node *p=ps->pTop;
while(p!=ps->PBottom)
{
printf("%d",p->date);
p=p->pNext; //高存放着低的地址
}
printf("\n");
}
2.5、判断栈是否为空
bool empty(struct Stack *ps)//判断栈是否为空
{
if(ps->pTop==ps->PBottom)
{
return true;
}
else
{
return false;
}
}
2.6、清空一个栈
bool pop(struct Stack *ps,int *pval)//把ps指向的栈出栈一次,并把出栈的元素存入pval中
{
if(empty(ps))//如果为空直接出栈
{
return false;
}
else
{
struct Node *r=ps->pTop;//将栈顶的地址付给方便不需要的空间释放
*pval=r->date;//把出栈的值存放,方便操作
ps->pTop=r->pNext;