因为数学建模的缘故,N多天都没有做算法练习了。
今天晚上先打一下自己关于下推栈创建的心得作为过渡,明天下午去图书馆刷个够!
栈的定义与性质
首先给出栈的百度百科:
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的示意图:
如图,栈的特点是,它的插入与删除全都在同一端。这就形成了栈的特性,即:先进栈的元素将在最后才能出栈,而后进栈的元素则先出栈。
举个例子,1 2 3 4 5 这五个元素依次进栈,那么将这个栈中依次出栈并输出的结果是:5 4 3 2 1、
懂了链表的各项操作之后,来看栈的相关操作就变得格外简单。
栈的初始化(STACKinit)
初始状态下,栈中无元素,头指针为空
void STACKinit()
{
head=NULL;
}
栈的压入(STACKpush)
栈压入与弹出一定是在同一端的,我们让压入端是栈的头部,那么压入一个元素也就意味着头指针的更新,其实也就相当于在头部新加入一个元素并让新的元素变为栈的头部:
struct node *NEW(int num,struct node *head)
{
struct node *t;
t=(struct node*)malloc(sizeof(struct node));
t->num=num;
t->next=head;
return t;
}
void STACKpush(int num)
{
head=NEW(num,head);
}
其中将两个函数合称为一个函数亦可。
栈的弹出
所谓弹出,就是将栈的首元素的值作为返回值返回给调用它的函数,同时将第二个元素作为首元素,释放首元素空间即可。也就相当于先用一个指针去接收head->next,而后将head指向的内存释放掉,同时让head更新为head->next即可。
int STACKpop()
{
int num=head->num;
struct node *t=head->next;
free(head);
head=t;
return num;
}