堆栈

来源:互联网 发布:mac 图片转文字 编辑:程序博客网 时间:2024/06/01 23:28

堆栈

什么是堆栈

堆栈是具有一定操作约束的线性表,它只在一端(栈顶,Top)做插入和删除操作。对战具有后入先出的特点,即后进入堆栈的元素因为更靠近栈顶,所以在出栈(删除)操作中先行考虑这个元素。在计算机中,函数递归、表达式运算、输入数据缓冲区等很多地方都必须使用堆栈。

堆栈的顺序存储实现

定义节点

#define MAXSIZEtypedef strcut SNode *Stackstruct SNode{    ElemType Data[MAXSIZE];    int Top; //工作计数变量};

入栈

void Push(Stack PtrS, ElemType item){    if(PtrS -> Top == MAXSIZE -1)    {        printf("堆栈满\n");        return;    }    else    {        PtrS -> Data[++ (PtrS -> Top)] = item;        return;    }}

出栈

ElemType Pop(Stack PtrS){    if(PtrS -> Top == -1)    {        printf("堆栈空\n");        return NULL;    }    else        return (PtrS -> Data[(PtrS -> Top) --]);}

实例:使用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间,入栈操作就能成功

分析:将数组的两端作为两个堆栈的入口,可以实现数组空间的最大化利用,不会造成浪费。当两个栈顶指针相遇时,表示堆栈满了。

ElemType Data[MAXSIZE];struct DStack{    ElemType Data[MAXSIZE];    int Top1;    int Top2;}void Push(struct DStack *PtrS, ElemType item, int Tag){    if(PtrS -> Top2 - PtrS -> Top1 == 1)    {        printf("堆栈满\n");        return;    }    if(Tag == 1)        PtrS -> Data[++ (PtrS -> Top1)] = item;    else        PtrS -> Data[-- (PtrS -> Top2)] = item;}ElemType Pop(struct DStack *PtrS, int Tag){    if(Tag == 1)    {        if(PtrS -> Top1 == -1)        {            printf("堆栈1空\n");            return NULL;        }        else            return (PtrS -> Data[(PtrS -> Top1) --]);    }    else    {        if(PtrS -> Top2 == MAXSIZE)        {            printf("堆栈2空\n");            return NULL;        }        else            return (PtrS -> Data[-- (PtrS -> Top2)])    }}

堆栈的链式存储实现

定义节点

typedef struct SNode *Stack;struct SNode{    ElemType Data;    struct SNode *Next;};

初始化(构建一个堆栈的头结点,返回指针。头结点没有任何元素,只是作为后续链表的入口)

Stack CreateStack(){    Stack S;    S = (Stack)malloc(sizeof(struct SNode));    S -> Next - NULL;    return S;}

判断堆栈是否为空

int IsEmpty(Stack S){    return (S -> Next == NULL); //若空返回1,不空返回0}

入栈

void Push(ElemType item, Stack S){    struct SNode *TmpCell;    TmpCell = (sturct *)malloc(sizeof(struct SNode));    TmpCell -> Data = item;    TmpCell -> Next = S -> Next;    S -> Next = TmpCell;}

出栈

ElemType Pop(Stack S){    struct SNode *FirstCell;    ElemType TopElem;    if(IsEmpty(S))    {        printf("堆栈空\n");        return NULL;    }    else    {        FirstCell = S -> Next;        S -> Next = FirstCell -> Next;        TopElem = FirstCell -> Next;        free(FirstCell);        return TopElem;    }}
原创粉丝点击