c语言 实现栈结构

c语言 实现栈结构

main.c


#include "Stack.h"
#include <stdio.h>
int main(){

    Stack stack;
    initStack(&stack);
    for (ElemType i = 0; i <=10; ++i) {
            push(&stack,i);
    }
    resetStack(&stack);
    while (!isStackEmpty(&stack)){
        printf("%d ",pop(&stack));
    }

    clearStack(&stack);
    return 0;
}

Stack.h

#ifndef __STACK_H__
#define __STACK_H__
#include <stdbool.h>

//线性存储
/*

typedef char ElemType;
typedef struct _Stack{
    int _len;
    int _top;
    ElemType * _space;
}Stack;

//初始化
void initStack();
//判断是否满
bool isStackFull();
//判断是否空
bool isStackEmpty();
//压栈
void push(Stack*,ElemType);
//弹栈
ElemType pop(Stack*);
//复位栈
void resetStack(Stack*);
//清空栈
void clearStack(Stack*);

*/
//链式存储
typedef int ElemType;
typedef struct _Node{
    ElemType data;
    struct _Node* next;
}Node;

typedef struct Stack{
    Node * top;
}Stack;

//初始化
void initStack(Stack*);
//判断是否空
bool isStackEmpty(Stack*);
//压栈
void push(Stack*,ElemType);
//弹栈
ElemType pop(Stack*);
//复位栈
void resetStack(Stack*);
//清空栈
void clearStack(Stack*);
#endif

Stack.c

#include "Stack.h"
#include <stdlib.h>
#include <stdio.h>
//初始化
void initStack(Stack *s){
    s->top= malloc(sizeof(Node));
    s->top->next=NULL;
}

//判断是否空
bool isStackEmpty(Stack *s){
    return s->top->next==NULL;
}

//压栈
void push(Stack* s,ElemType data){
    Node * cur=(Node *)malloc(sizeof(Node));
    cur->data=data;
    cur->next=s->top->next;
    s->top->next=cur;
}

//出栈
ElemType pop(Stack* s) {
    Node *temp=s->top->next;
    ElemType data=temp->data;
    printf("弹出:%d",data);
    s->top->next=s->top->next->next;
    free(temp);
    return data;

}

//复位栈
void resetStack(Stack* s){
    while (!isStackEmpty(s)){
        pop(s);
    }
}

//清空栈
void clearStack(Stack* s){
    resetStack(s);
    free(s->top);
}```

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可能只会写BUG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值