用c代码实现简单的出栈和压栈


栈其实就是一种实现“先进后出”的一种存储结构。


用动态链表的方式实现出栈和压栈:

                         

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


//节点的结构
typedef struct Node
{
    int date;
    struct Node *pNext;
}NODE, *PNODE;

//栈顶和栈底的指针
struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK, *PSTACK;


//先建造一个空的节点,让栈底和站顶相等,建造空的节点易于操作栈。
void initStack(PSTACK pS)
{
    PNODE S = (PNODE)malloc(sizeof(NODE));
    if(S == NULL)
    {
        printf("S malloc failed\n");
        exit(-1);
    }
    pS->pTop = S;
    pS->pBottom = S; 
    S->pNext = NULL; 
}

void pushStack(PSTACK pS, int date)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if(pNew == NULL)
    {
        printf("pNew malloc failed\n");
        exit(-1);
    }
    pNew->date = date;
    pNew->pNext = pS->pTop;
    pS->pTop = pNew;

}

void traverseStack(PSTACK pS)
{
    PNODE P;
    P = pS->pTOP;
    while(p != pS->pBottom)
    {
        printf("%d ",p->date);
        p = p->pNext;
    }
    printf("\n");
    return;
}
bool popStack(PSTACK pS, int *pVal)
{
    if(pS->pTop == pS->pBottom)
    {
        printf("stack is emply\n");
        return false;
    }
    PNODE r;
    r = pS->pTop;
    *pVal = r->date;
    pS->pTop = r->pNext;
    free(r);
    r = NULL;
    return true;
}

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

int main(void)
{
    STACK S;    //STACK 等价于 struct Stack
    int val;
    bool ret;
    initStack(&S);   //目的是建造一个空栈
    pushStack(&S, 1); //压栈
    ret = popStack(&S, &val); //出栈元素
    if(ret == false)
    {
        printf("栈为空\n");
    }
    else
    {
        printf("出栈元素是 %d \n", val);
    }
    traverseStack(&S);  //遍历栈
    clear(&pS);  //清空栈

}

                   

猜你喜欢

转载自blog.csdn.net/qq_34765864/article/details/73692884