栈(stack)的概念、结点设计、入栈操作C语言代码表示

2022-07-1712:04:38数据结构与算法Comments1,052 views字数 1453阅读模式

1. 栈的概念文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

在开始前,请牢记这句话:栈是一种先进后出的数据结构文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而操作也只能够进行插入一个新的结点与删除最末尾的这个结点两个操作,而这样强限制性的‘链表’,就是我们所说的栈。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

让我们重新理顺一下定义:栈是一个线性的数据结构,规定这个数据结构只允许在其中一端进行操作,并禁止直接访问除这一端以外的数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

栈(stack)的概念、结点设计、入栈操作C语言代码表示文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

如图:栈就像一个放球的单管桶,只允许球从桶的开口这一端取出,并且球先放入桶中则后从桶中拿出。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

2. 栈的结点设计文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

栈分为数组栈和链表栈,其区别是数组栈使用数组进行功能的模拟,实现较为快速和便利,而链表栈使用链表的思路去设计,实现较为麻烦,但是其稳定不易出错;在链表栈中又分为静态链表栈和动态链表栈,静态链表栈给定栈的空间大小,不允许超过存储超过给定数据大小的元素,而动态栈使用的是自动创建空间的方法进行创建,只要符合机器的硬件要求以及编译器的控制,其理论上是极大的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

说了那么多,我们以链表栈的动态链表栈为例子,进行栈的设计,在后文直接以栈一名字称呼动态链表栈,这也是各类语言标准模板中栈的实现方式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

首先是栈的结点设计,我们可以设计出两个结构体,一个结构体Node表示结点,其中包含有一个data域和next指针。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

栈(stack)的概念、结点设计、入栈操作C语言代码表示文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

其中data表示数据,其可以是简单的类型(如int,double等等),也可以是复杂的结构体(struct类型);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

next指针表示,下一个的指针,其指向下一个结点,通过next指针将各个结点链接。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

目前的设计如同单链表,接下来,为这个进行限制性的设计,我们额外添加一个结构体,其包括了一个永远指向栈头的指针top和一个计数器count记录元素个数,(也可以设计成一个指针top和一个指针bottom分别指向栈头和栈尾)其主要功效就是设定允许操作元素的指针以及确定栈何时为空(count的方法是当count为0时为空,top和bottom方法就是两者指向同一个空间时为栈为空)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

栈(stack)的概念、结点设计、入栈操作C语言代码表示文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

这里我采用的是top和count组合的方法。其代码可以表示为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

//栈的结点设计
//单个结点设计,数据和下一个指针
typedef struct node     
{
    int data; 
    struct node *next;
} Node;
//利用上面的结点创建栈,分为指向头结点的top指针和计数用的count
typedef struct stack    
{
    Node *top;
    int count;
} Link_Stack;


3. 栈的基本操作—入栈
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

如图:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

栈(stack)的概念、结点设计、入栈操作C语言代码表示文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

入栈(push)操作时,我们只需要找到top所指向的空间,创建一个新的结点,将新的结点的next指针指向我们的top指针指向的空间,再将top指针转移,指向新的结点,即是入栈操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

其代码可以表示为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html

//入栈 push
Link_Stack *Push_stack(Link_Stack *p, int elem)
{
    if (p == NULL)
        return NULL;
    Node *temp;
    temp=(Node*)malloc(sizeof(Node));
    //temp = new Node;
    temp->data = elem;
    temp->next = p->top;
    p->top = temp;
    p->count++;
    return p;
}
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25082.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/25082.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定