数据结构:栈

1.定义

  一种可以实现“先进后出”的存储结构

  栈类似于箱子,往箱子里面放书,先放进去的最后才能拿出来

2.分类

  静态栈

  动态栈

3.算法

  出栈

  入栈

4.应用

  函数调用

  中断

  表达式求值

  内存分配

  缓冲处理

  迷宫

5.代码实现

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


//实现栈的功能,先进后出

typedef struct Node
{
    int data;
    struct Node * pNext;
}NODE, *PNODE;


typedef struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK, *PSTACK; //STACK 等价于struck Stack*

void Init(PSTACK);
void push(PSTACK, int);
void traverse(PSTACK);
bool pop(PSTACK, int * );
bool empty(PSTACK);

int main()
{
    int val;
    STACK S; //STACK 等价于struct Stack

    Init(&S);
    push(&S, 1);
    push(&S, 2);
    push(&S, 3);
    push(&S, 4);
    push(&S, 5);
    push(&S, 6);
    traverse(&S); //遍历输出


    if (pop(&S, &val))
    {
        printf("出栈成功!出栈的元素是%d\n",val);
    }
    else
    {
        printf("出栈失败!\n");
    }
    clear(&S);

    traverse(&S);
    return 0;
}

void Init(PSTACK pS)
{
    pS->pTop = (PNODE)malloc(sizeof(NODE));
    if (NULL == pS->pTop)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    else
    {
        pS->pBottom = pS->pTop;
        pS->pTop->pNext = NULL; // pS->pBottom->pNext = NULL;
    }
}

void push(PSTACK pS, int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));

    pNew->data = val;
    pNew->pNext = pS->pTop;
    pS->pTop = pNew;
    return;
}

void traverse(PSTACK pS)
{
    if (empty(pS))
    {
        printf("栈为空,无法遍历");
    }
    else
    {
        PNODE p = pS->pTop;
        while(p != pS->pBottom)
        {
            printf("%d ",p->data);
            p = p->pNext;
        }
    }
    printf("\n");
    // pBottom一直是垃圾值
    return;
}

bool empty(PSTACK pS)
{
    if (pS->pTop == pS->pBottom)
    {
        return true;
    }
    else
    {
        return false;
    }
}


//把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,则返回false
bool pop(PSTACK pS, int * pVal)
{
    if (empty(pS)) //pS本身存放的就是S的地址,if(empt返回true则执行return false)
    {
        return false;
    }
    else
    {
        PNODE r = pS->pTop;
        *pVal = r->data;
        pS->pTop = pS->pTop->pNext;
        free(r);
        r = NULL;
        return true;
    }
}

//clear清空
void clear(PSTACK pS)
{
    if (empty(pS))
    {
        return;
    }
    else
    {
        PNODE ClearNode = pS->pTop;
        PNODE TempNode = pS->pTop;
//        while(ClearNode != pS->pBottom)    
//        {
//            TempNode = ClearNode->pNext;
//            free(ClearNode);
//            ClearNode = TempNode;
//        }
        while(ClearNode != NULL)    //更容易被理解
        {
            TempNode = ClearNode;
            ClearNode = ClearNode->pNext;
            free(TempNode);
        }
        Init(pS);
    }
}

posted on 2019-05-24 13:12  zhaoy_shine  阅读(155)  评论(0编辑  收藏  举报

导航