今天学习了栈的概念和其基本操作。自我认为,栈就是一种受限制的链表,通过头指针pTop和尾指针pBottom对栈进行出栈和入栈的操作。栈的思想是先入后出。
首先来介绍栈的创建,即栈的初始化。所谓栈的初始化,就是创建一个节点使得头指针和为指针都指向这个节点,并且这个节点和链表头指针一样没有任何数据。由此完成了栈的创建操作。
栈的创建代码为:
void init(PSTACK s)
{
PNODE p=(PNODE)malloc(sizeof(NODE));
if(p==NULL)
{
printf("内存分配失败\n");
exit(-1);
}
else
{
s->pTop=p;
s->pBottom=s->pTop;
p->pNext=NULL;
}
}
栈的入栈代码为:
void push(PSTACK s,int val)
{
PNODE p=(PNODE)malloc(sizeof(NODE));
p->dat=val;
p->pNext=s->pTop;
s->pTop=p;
}
然后是出栈操作,即删除数据。由于栈遵循的是先入后出的概念,所以最先压入栈的元素一定是最后出栈的,最先出栈的元素是最后入栈的。首先创建一个节点,这个节点保存的是头指针指向的节点,然后将头指针指向下一个节点,并且释放创建的节点。由此则完成出栈的操作。
栈的出栈代码为:
bool pop(PSTACK s,int *pVal)
{
PNODE p;
if(s->pTop==s->pBottom)
return false;
else
{
p=s->pTop;
*pVal=p->dat;
s->pTop=p->pNext;
free(p);
return true;
}
}
栈的遍历代码为:
void travel(PSTACK s)
{
PNODE p;
p=s->pTop;
while(p!=s->pBottom)
{
printf("%d ",p->dat);
p=p->pNext;
}
printf("\n");
}
栈的清空代码为:
void clear(PSTACK s)
{
PNODE p;
if(s->pBottom==s->pTop)
printf("栈已空。\n");
else
{
p=s->pTop;
while(s->pTop!=s->pBottom)
{
s->pTop=p->pNext;
free(p);
p=s->pTop;
}
free(p);
printf("栈已清空!\n");
}
}