数据结构-栈(1)

对于栈,我认为是跟链表差不多的东西。

贴出代码,写出了链表的初始化,压栈,出栈等函数。

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

//数据存放节点
typedef struct Node{
    int data;
    struct Node * pNext;
}NODE, *PNODE;

//节点的头指针,尾指针
typedef struct Stack{
    PNODE pTop;
    PNODE pBottom;
}STACK, *PSTACK;
//保证数据的类型和指针的类型相等

//函数声明
void init(PSTACK);//栈的建立
void push(PSTACK, int);//压栈函数
void pop(PSTACK);//出栈函数
void clear(PSTACK);
void traverse(PSTACK);//遍历输出

int main(){
    STACK S;//定义栈S,相当于struct Stack S;
    init(&S);//创建栈

    //将数据压栈
    push(&S, 1);
    push(&S, 2);

    pop(&S);
    traverse(&S);

    clear(&S);
    traverse(&S);

    return 0;
}


void init(PSTACK pS){
    //动态分配一个数据存放的节点,pTop和pBottom初始指向的节点相同,所以只需要动态分配一片区域
    pS->pTop = (PNODE)malloc(sizeof(NODE));
    if(NULL == pS->pTop){
        printf("动态分配失败\n");
        exit(-1);
    }
    else{
        pS->pBottom = pS->pTop;//尾指针和头指针指向同一区域
        pS->pTop->pNext = NULL;//最底部的数据节点的pNext为NULL
    }
}

void push(PSTACK pS, int val){
    //定义一个新的节点
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    pNew->data = val;//新节点的数据域为val
    pNew->pNext = pS->pTop;//新建立的节点指向原来的栈中的头节点
    pS->pTop = pNew;//让Top指向新的头节点
}

//从栈顶开始,按照链表的规定进行输出
void traverse(PSTACK pS){
    while(pS->pBottom != pS->pTop){
        printf("%-5d", pS->pTop->data);
        pS->pTop = pS->pTop->pNext;
    }
    printf("\n");
}

void pop(PSTACK pS){
    if(pS->pTop == pS->pBottom){
        printf("栈为空栈\n");
        exit(-1);
    }
    else{
        //定义一个新的PNODE数据是为了方便寻找出栈的节点来free
        PNODE pNew;
        pNew = pS->pTop;
        pS->pTop = pS->pTop->pNext;
        free(pNew);
        pNew = NULL;

        if(pS->pTop == pS->pBottom){
            printf("栈为空栈\n");
        }
    }
}

void clear(PSTACK pS){
    if(pS->pTop == pS->pBottom){
        printf("栈为空栈\n");
        exit(-1);
    }
    else{
        PNODE p = pS->pTop;
        PNODE q = NULL;
        while(p != pS->pBottom){
            q = p->pNext;
            free(p);
            p = q;
        }
        pS->pTop = pS->pBottom;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值