栈|数据结构|C语言|详细讲解|代码实现

本文介绍了栈的概念,区分了静态栈和动态栈在内存分配上的差异,以及它们的操作如入栈、出栈等。通过代码示例详细展示了如何用C语言实现栈的基本功能。
摘要由CSDN通过智能技术生成

介绍栈

内存可以分为“静态内存”和“动态内存”,讲台内存是在栈中分配的,动态内存是在堆中分配的。

静态或局部变量,是以压栈和出栈的方式分配内存的,就叫栈区;

动态内存是一个一种堆排序的方式分配内存的,就叫堆区。

栈的分类

静态栈和动态栈是两种常用的数据结构,它们的主要区别在于存储方式。

1. 静态栈:

静态栈通常使用数组来实现。它有一个固定的大小,即栈的最大容量。一旦栈满了,就无法再添加元素,除非重新分配更大的数组。静态栈的优点是操作速度快,因为数组的访问和更新都是直接进行的。但缺点是灵活性较差,因为栈的大小在创建时就已经确定,无法动态地增加或减少。

2. 动态栈:

动态栈通常使用链表来实现。与静态栈不同,动态栈的大小是动态的,可以根据需要增长或缩小。当栈满时,可以通过添加新的节点来扩展其容量;当栈空时,可以释放一些节点以减小其容量。动态栈的优点是灵活性高,可以适应不同的需求,而不需要预先确定栈的大小。但缺点是操作速度较慢,因为链表的访问和更新需要遍历节点。

总结来说,静态栈和动态栈各有优缺点。静态栈操作速度快,但灵活性差;动态栈灵活性高,但操作速度慢。选择使用哪种数据结构取决于具体的应用场景和需求。

栈可以执行哪些操作

·出栈(弹栈)

·入栈(压栈)

栈程序演示

 

代码实现 

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//定义链表节点的数据类型
typedef struct Node{
    int data;
    struct Node* pNext;
}NODE,*PNODE;

//定义栈数据类型
typedef struct Stack{
    PNODE top;//指向栈顶元素
    PNODE bottom;//指向栈底元素的下一个位置
}stack,*pstack;

void init(pstack s);//初始化,创建空栈
void push(pstack s,int val);//入栈
void traverse(pstack s);//出栈
int showTop(pstack s);//显示栈顶元素
int pop(pstack s);//出栈
bool isEmpty(pstack s);

int main(){
    stack S;
    init(&S);
    push(&S,1);
    push(&S,-9);
    push(&S,88);
    traverse(&S);
    printf("栈顶元素为%d\n",showTop(&S));
    printf("出来一个栈顶元素:%d\n",pop(&S));
    printf("出来一个栈顶元素:%d\n",pop(&S));
    printf("出来一个栈顶元素:%d\n",pop(&S));
    //printf("出来一个栈顶元素:%d\n",pop(&S));
    traverse(&S);
    
    
    return 0;
}


//初始化栈
//创建一个空栈,空战就是栈的top和bottom指针都指向一个空的不存储任何数据的节点
void init(pstack s){
    s->top=(PNODE)malloc(sizeof(NODE));
    if(!s->top){
        printf("动态内存分配失败\n");
        exit(-1);
    }else{
        s->bottom=s->top;
        s->top->pNext=NULL;//或s->bottom->pNext=NULL;
    }
}


void push(pstack s,int val){
    PNODE pnew=(PNODE)malloc(sizeof(NODE));
    pnew->data=val;
    pnew->pNext=s->top;/*这一步不能是pnew->pNext=s->bottom,因为这一步是入栈而不是插入第一个元素。
                          bottom和top最开始都存着的空节点的地址,但只有top一直存着最顶端元素的地址*/
    s->top=pnew;
}


void traverse(pstack s){
    if(isEmpty(s)){
        printf("栈已空,无法遍历");
        exit(-1);
    }
    PNODE p=s->top;
    while(p!=s->bottom){
        printf("%d  ",p->data);
        p=p->pNext;
    }
    printf("\n");
}

int showTop(pstack s){
    return s->top->data;
}

bool isEmpty(pstack s){
    if(s->top==s->bottom){
        return 1;
    }
    return 0;
}

int pop(pstack s){
    if(isEmpty(s)){
        printf("栈已空,无法出栈");
        exit(-1);
    }
    int val=s->top->data;
    PNODE p=s->top;
    s->top=s->top->pNext;
    free(p);
    return val;
}

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01红C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值