数据结构之栈

栈的代码实现

栈的思想
栈的核心思想为先进先出
栈的结构体和链表类似,但是有了一些升级,在节点的基础上增加了新的结构体STACK其中包含着顶指针以及底指针。**注意栈的结构体中两个指针得到格式为pNode!!!**因为这两个指针指向的数据类型为NODE类型的节点!

typedef struct NODE{
    int data ;
    struct NODE *pNext;
}NODE,*pNode;
typedef struct STACK{
    pNode *Top;
    pNode *Bottom;
}STACK,*pSTACK;

栈的基本操作

  1. init_stack()
    栈的初始化思想为,在定义了一个栈的结构体之后,我们可以得到两个指针,但是这两个指针并没有指向任何一个结构体,此时并不是一个完整的结构体,应该先定义一个类似于链表中的头节点的Node,其中不存储任何数据,只用来保存指针。然后使两个指针指向Node即可
void init_stack(pSTACK pS){
    pNode pNew=(pNode)malloc(sizeof(NODE));
    if (pNew==NULL){
        printf("分配内存失败!\n");
        exit(-1);
    }
    else{
        pS->Bottom=pNew;
        pS->Top=pNew;
    }
}
  1. push()
    入栈操作,只需要注意指针的指向即可
void push(pSTACK pS,int value){
    pNode pNew=(pNode)malloc(sizeof(NODE));
    pNew->data=value;
    pNew->pNext=pS->Top;
    pS->Top=pNew;

}
  1. pop()
    出栈的注意事项为被弹出的Node记得free一下
void pop(pSTACK pS,int value ){
    if(pS->Top!=pS->Bottom){
        pNode p=pS->Top;
        value=p->data;
        pS->Top=p->pNext;
        free(p);
        p=NULL;
    }
    printf("the pop number is %d\n",value);
}

完整的代码示例


    #include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
typedef struct NODE{
    int data ;
    struct NODE *pNext;
}NODE,*pNode;
typedef struct STACK{
    pNode *Top;
    pNode *Bottom;
}STACK,*pSTACK;
void init_stack();
void push();
void pop();
void show_stack();
int main(){
    STACK S;
    pSTACK pS=&S;
    init_stack(pS);
    push(pS,5);
    push(pS,6);
    push(pS,7);
    show_stack(pS);
    printf("\n");
    pop(pS);
    pop(pS);
    show_stack(pS);
}
void init_stack(pSTACK pS){
    pNode pNew=(pNode)malloc(sizeof(NODE));
    if (pNew==NULL){
        printf("分配内存失败!\n");
        exit(-1);
    }
    else{
        pS->Bottom=pNew;
        pS->Top=pNew;
    }
}
void push(pSTACK pS,int value){
    pNode pNew=(pNode)malloc(sizeof(NODE));
    pNew->data=value;
    pNew->pNext=pS->Top;
    pS->Top=pNew;

}
void show_stack(pSTACK pS){
    pNode p=pS->Top;
    while (p!=pS->Bottom){
        printf("%d\n",p->data);
        p=p->pNext;

    }
}
void pop(pSTACK pS,int value ){
    if(pS->Top!=pS->Bottom){
        pNode p=pS->Top;
        value=p->data;
        pS->Top=p->pNext;
        free(p);
        p=NULL;
    }
    printf("the pop number is %d\n",value);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值