美文网首页
单链表实现栈(C语言)

单链表实现栈(C语言)

作者: Recalcitrant | 来源:发表于2019-05-26 11:38 被阅读0次

单链表实现栈

/*
链栈
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>

#define ElemType int        //栈数据类型

#define OK 0                //操作成功执行
#define ERROR -1            //操作失败
#define OVERFLOW -2         //溢出
typedef int Status;

typedef struct SNode {
    ElemType data;          //数据域
    struct SNode *next;     //指针域
}SNode, *LinkStack;

Status InitStack_L(LinkStack *S);                       //1.创建
Status DestroyStack_L(LinkStack S);                     //2.销毁
Status ClearStack_L(LinkStack S);                       //3.清空
Status StackEmpty_L(LinkStack S);                       //4.判空
int StackLength_L(LinkStack S);                         //5.求长
ElemType GetTop_L(LinkStack S);                         //6.返回栈顶元素
Status Push(LinkStack S, ElemType e);                   //7.压栈
Status Pop(LinkStack S, ElemType *e);                   //8.弹栈
Status StackTraverse_L(LinkStack S);                    //9.遍历

/*
Status InitStack_L(LinkStack *S)        //1.创建
{
    S = (LinkStack *)malloc(sizeof(SNode));
    (*S)->data = 0;
    (*S)->next = NULL;
    return OK;
}
*/
LinkStack InitStack_L()     //1.创建
{
    LinkStack S;
    S = (LinkStack)malloc(sizeof(SNode));
    S->data = 0;
    S->next = NULL;
    return S;
}

Status DestroyStack_L(LinkStack S)      //2.销毁
{
    SNode *p, *q;
    p = S->next;
    while (p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    free(S);
    S = NULL;
    return OK;
}
Status ClearStack_L(LinkStack S)        //3.清空
{
    SNode *p, *q;
    p = S->next;
    while (!p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    S->data = 0;
    S->next = NULL;
    return OK;
}
Status StackEmpty_L(LinkStack S)      //4.判空
{
    if (S->next == NULL) return 1;
    else return 0;
}
int StackLength_L(LinkStack S)      //5.求长
{
    return S->data;
    /*
    SNode *p;
    p = S;
    int j = 0;
    while (!p->next)
    {
        p = p->next;
        j++;
    }
    return j;
    */
}
ElemType GetTop_L(LinkStack S)                  //6.返回栈顶元素
{
    return S->next->data;
    /*
    SNode *p;
    p = S;
    int j = 0;
    while (p && j < i)
    {
        p = p->next;
        j++;
        if (p && j == i)return p->data;
    }
    if (!p || j > i)return ERROR;
    */
}
Status Push(LinkStack S, ElemType e)                    //7.压栈
{
    SNode *p, *q;
    p = S->next;
    q = (SNode *)malloc(sizeof(SNode));
    q->data = e;
    q->next = p;
    S->next = q;
    S->data++;
    return OK;
}
Status Pop(LinkStack S, ElemType *e)                        //8.弹栈
{
    SNode *p;
    p = S->next;
    S->next = p->next;
    *e = p->data;
    free(p);
    S->data--;
    return OK;
}
Status StackTraverse_L(LinkStack S)                     //9.遍历
{
    SNode *p;
    p = S->next;
    for (int i = 0; i < StackLength_L(S); i++)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    return OK;
}
int main(int argc, char *argv[])
{
    ElemType e;
    LinkStack S;
    S = InitStack_L();
    Push(S, 1);
    Push(S, 2);
    printf("%d\n", GetTop_L(S));
    Push(S, 3);
    Push(S, 4);
    while (!StackEmpty_L(S))
    {
        Pop(S, &e);
        printf("%d ", e);
    }
    //StackTraverse_L(S);


    DestroyStack_L(S);
    //std::cout << "666" << std::endl;
    return 0;
}

相关文章

网友评论

      本文标题:单链表实现栈(C语言)

      本文链接:https://www.haomeiwen.com/subject/mbyxtctx.html