数据结构入门之———离散存储结构【链表】——栈

数据结构入门之———离散存储结构【链表】——栈

郝斌——数据结构

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

typedef struct Node
{
    int data;
    struct Node * pNext;
}NODE,*PNODE;   //PNODE  等价与struct Node *

typedef struct Stack        //设想栈类似一个箱子
{
    PNODE pTop;         //pTop指向箱子的入口
    PNODE pBottom;         //pBottom指向箱子底部的下一个元素
}STACK,*PSTACK;         //PSTACK  等价与struct Stack *

void init(PSTACK pS);               /*初始化栈:目的是造出一个空栈*/
void push(PSTACK pS,int val);           /*操作:压栈*/
void traverse(PSTACK);                  /*操作:遍历栈*/
bool pop(PSTACK pS,int *pVal);          /*操作:出栈*/
bool empty(PSTACK pS);                   /*操作:判断此栈是否是空栈*/
void clear_STACK(PSTACK pS);                /*操作:清空栈,回到创建栈的状态,即一个空栈*/

int main(void)
{
    STACK S;        //STACK 等价于 struct Stack
    int val;
    init(&S);      //初始化栈:目的是造出一个空栈
    push(&S,1);     //压栈
    push(&S,2);
    push(&S,3);
    push(&S,4);
    push(&S,6);
    traverse(&S);
    clear_STACK(&S);  //清空
    
    if(pop(&S,&val))
    {
        printf("出栈成功!出栈的元素是:%d\n",val);
    }
    else
    {
        printf("出栈失败!\n");
    }
    traverse(&S);         //遍历
//    clear_STACK(&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;
    }
    
}
/*操作:压栈*/
/*前提条件:已经建好一个空箱子,要存入箱子的值val,该箱子的入口地址*/
/*后置条件:使箱子的入口指针指向当前压栈的地址,成为新的入口*/
void push(PSTACK pS,int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));       //创建一个新的节点
    pNew->data = val;
    pNew->pNext = pS->pTop;     //pNew->pNext = pS->pTop;空栈时可这样写,非空时禁止!
    pS->pTop = pNew;
    
    return ;
}
/*操作:遍历栈*/
/*前提条件:该箱子的入口地址*/
/*后置条件:打印栈中的值*/
void traverse(PSTACK pS)
{
    PNODE p = pS->pTop;
    
    while(p != pS->pBottom)
    {
        printf("%d ",p->data);
        p = p->pNext;
    }
    printf("\n");
    
    return ;
}
/*操作:判断此栈是否是空栈*/
/*前提条件:该箱子的入口地址*/
/*后置条件:返回判断的结果*/
bool empty(PSTACK pS)
{
    if(pS->pTop == pS->pBottom)
        return true;
    else
        return false;
}

/*把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回fasle,否则返回true*/
/*操作:出栈*/
/*前提条件:该箱子的入口地址,指向待出栈的值的指针pVal*/
/*后置条件:返回是否成功出栈*/
bool pop(PSTACK pS,int *pVal)
{
    if(empty(pS))
    {
        return false;
    }
    else
    {
        PNODE r = pS->pTop;
        *pVal = r->data;
        pS->pTop = pS->pTop->pNext;
        free(r);
        r = NULL;
        
        return true;
    }
}

/*操作:清空栈,回到创建栈的状态,即一个空栈*/
/*前提条件:该箱子的入口地址*/
/*后置条件:使栈为空*/
void clear_STACK(PSTACK pS)       //清空
{
    if(empty(pS))
    {
        return;
    }
    else
    {
        PNODE p = pS->pTop;
        PNODE q = NULL;
        
        while(p != pS->pBottom)
        {
            q = p->pNext;
            free(p);
            p = q;
        }
        pS->pTop = pS->pBottom;
    }
    return ;
}

程序运行示例:
————————————————————————————
6 4 3 2 1
出栈失败!

Program ended with exit code: 0
————————————————————————————

猜你喜欢

转载自blog.csdn.net/qq_43656353/article/details/104588723