下推栈的相关操作

因为数学建模的缘故,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;
}

猜你喜欢

转载自blog.csdn.net/cprimesplus/article/details/82747402