堆栈概念、节点设计和堆栈操作 C 代码表示
1。堆栈概念
在开始之前,请记住这句话: 堆栈是一种先进后出的数据结构 。
栈(stack)是一种数据结构,它限制操作只能在列表的一端进行。请联系我们了解我们之前了解到的情况。想象一个单链表。我们只能对链表的终端节点进行操作,并且操作只能执行两个操作:插入新节点和删除最后一个节点。我们将这种高度限制的“链表”称为堆栈。
我们重新整理一下定义:栈是一种线性数据结构,规定这种数据结构只允许在一端进行操作,禁止直接访问该端以外的数据。
![]()
如图:杂志就像一个单管球桶。只允许从桶的开口端取出球,并且先将球放入桶中,然后再从桶中取出。
2。栈节点设计
栈分为数组栈和链表栈。不同的是,数组栈使用数组来模拟功能,实现起来更快更方便,而链表栈则利用链表的思想来设计。实现难度较大,但稳定不易出错;链表栈分为静态链表栈和动态链表栈。由于堆栈的空间大小,静态链表堆栈不得存储超过给定数据大小的元素,而动态堆栈则采用自动空间创建方法来创建。只要满足机器的硬件要求和翻译器的控制,理论上就很好。
说了这么多,我们以动态链表栈为例来进行栈设计。在下文中,我们将动态链表栈直接称为栈。这也是各种语言的标准模板中栈的实现方式。
首先是堆叠节点设计。我们可以提出两种结构。单个 Node 结构表示包含数据字段和另一个指针的节点。
![]()
Data表示数据,可以是简单类型(如int、double等),也可以是复杂结构(struct类型);
next 指针表示另一个向下指向该节点的指针。每个节点都通过另一个指针连接。
当前的外观就像一个单链表。接下来,我们在这个限制性设计中添加另一个结构,其中包括指针的顶部,它始终指向堆栈的头部,以及一个记录元素数量的计数器(也可以设计为指针的顶部和指向栈头和栈尾的指针的底部)。它的主要功能是设置一个允许控制元素的指针,并判断栈何时为空(count方法在计数为0时为空,top和bottom方法意味着当两者都指向同一个地方时,栈为空)空)
![]()
这里我使用了top和count方法的结合。其代码可以表示为: // 栈节点设计 ❀ Node 结构 // 单节点设计,数据和另一个指针 TypeDef ![]()
![]()
{ int 数据; node *next;} Node;//使用上面的Point节点创建一个栈,拆分为指向主节点的上指针并计数typedef❙ ![]()
![]()
堆栈 { 节点 *top; int count;} Link_Stack;
代码可以表示为:
3. 堆栈基本操作:push❙ 我们❙Pu只要找到顶节点指向的空间,创建一个新节点,将新节点的next指针指向我们的top指针所指向的空间,然后移动top指针指向新节点,这是一个栈操作。 。 //PushLink_Stack *Push_stack(Link_Stack *p, int❙❙![]()
如果 (p == NULL) 返回 ❙‶❙ NULL;❙ temp=(节点*) malloc ( size(node));// temp =❙> data‶> data elem;temp-> next = p-> p--> top; p->顶部 = 温度; p->计数++ str;}
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网