数据结构--栈

/*
    栈是允许在同一端进行插入和删除操作的特殊线性表。"先进后出"  像往箱子里装东西
    允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);
    栈底固定,而栈顶浮动;
    栈中元素个数为零时称为空栈。
    插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。

*/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "MyStock.h"

int main()
{
    MyStack stack1;
    int Value;


    InitStack(& stack1);      //初始化栈
    PushStack(& stack1, 1);   //压栈
    PushStack(& stack1, 2);
    PushStack(& stack1, 22);


    PopStack(& stack1, &Value);


    Traverse(& stack1);      //对栈进行遍历


    ClearStack(& stack1);
    printf("\n清空栈!\n");
    Traverse(& stack1);

    return 0;
}


/*

        MyStock.h 头文件定义和声明

*/

#ifndef MYSTOCK_H_INCLUDED
#define MYSTOCK_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


typedef struct _element
{
    int date;
    struct Element * PNext;
}* PElement, Element;


typedef struct _mystack
{
    PElement PTop;
    PElement PBottom;
}* PMyStack, MyStack;


void InitStack(PMyStack);   //生成一个栈 使PTop和PBottom指向同一个只用来存放地址的节点
bool PushStack(PMyStack, int);
void Traverse(PMyStack);
bool PopStack(PMyStack, int *);//出栈 并返回这个值
void ClearStack(PMyStack);//清空栈
bool EmptyStack(PMyStack);


#endif // MYSTOCK_H_INCLUDED


/*

       MyStock.c 函数实现文件

*/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "MyStock.h"


void InitStack(PMyStack PStack)//创建一个栈
{
    PStack->PTop = (PElement)malloc(sizeof(Element));
    if(NULL == PStack->PTop)
    {
        printf("\nPStack->PTop内存分配失败!\n");
        exit(-1);
    }
    else
    {
        PStack->PBottom = PStack->PTop;//初始化的时候,PStack->PBottom = PStack->PTop共同指向一个空的区域
        PStack->PBottom->PNext = NULL;
    }


    return;
}


bool PushStack(PMyStack PStack, int val)//压栈
{
    PElement PNew = (PElement)malloc(sizeof(Element));//新建的一个栈的节点
    PNew->date = val;
    PNew->PNext = PStack->PTop;//栈的Top指向最上面一个节点
    PStack->PTop = PNew;//说PTop指向最上面的节点,即PTop存储的是PNew的指针


    return true;
}


/*------------------------错--------------------------
bool PushStack(PMyStack PStack, int val)//压栈
{
    PElement PHead = (PElement)malloc(sizeof(Element));
    PHead = NULL;
    PElement PNew = (PElement)malloc(sizeof(Element));//新建的一个栈中节点
    PNew->date = val;
    PStack->PTop->PNext = PNew;
    PNew->PNext = PHead;
    PStack->PBottom->PNext = PHead;


    return;
}
------------------------错---------------------------*/


void Traverse(PMyStack PStack)//遍历栈中的所有元素数据域
{
    PElement PTem = PStack->PTop;
    printf("\n");
    while(PTem != PStack->PBottom)
    {
        printf("%d\t", PTem->date);
        PTem = PTem->PNext;
    }


    return;
}


bool EmptyStack(PMyStack PStack)
{
    if(PStack->PBottom == PStack->PTop){
        return true;
    }
    return false;
}


bool PopStack(PMyStack PStack, int * Value)//出栈一次,并返回出栈的值
{
    if(PStack->PBottom == PStack->PTop){
        return false;
    }
    else
    {
        PElement PTem = PStack->PTop;
        PStack->PTop = PStack->PTop->PNext;
        printf("\n出栈的数是:%d\n", PTem->date);\
        free(PTem);


        return true;
    }
}


void ClearStack(PMyStack PStack)//清空所有的元素
{
    if(EmptyStack(PStack)){
        return;
    }
    else
    {
        PElement PTem1 = PStack->PTop;//头指针
        PElement PTem2 = NULL;//第一个节点的指针


        while(PTem1 != PStack->PBottom)
        {
            PTem2 = PTem1->PNext;
            free(PTem1);
            PTem1 = PTem2;
        }
        PStack->PTop = PStack->PBottom;
        return;
    }


}















































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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值