4.1.1 栈的链式存储结构及实现

概念

栈的链式存储结构,简称为链栈。
由於单链表有头指针,而栈顶指针也是必须的,所以把栈顶放在单链表的头部。另外,因为有了栈顶在头部了,所以单链表中比较常用的头结点也就失去了意义,通常对于链表来说,是不需要头结点的。
这里写图片描述
链栈的结构代码:

typedef struct StackNode
{
    SElemType data;
    struct StackNode* next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;

进栈操作

逻辑图:
这里写图片描述
代码:

/*插入元素e为新的栈顶元素*/
Status Push(LinkStack *S, SElemType e)
{
    LinkStackPtr n = (LinkStackPtr)malloc(sizeof(StackNode));
    n->data = e;
    n->next = S->top;/* 把当前的栈顶元素赋值给新结点的直接后继 */ 
    S->top = n;     /* 将新的结点n赋值给栈顶指针 */
    S->count++;
    return OK;
}

出栈操作

逻辑图:
这里写图片描述
代码:

/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/
Status Pop(LinkStack *S, SElemType *e)
{
    LinkStackPtr p;
    if (StackEmpty(*S))
        return ERROR;
    *e = S->top->data;
    p = S->top; /*将栈顶结点赋值给p*/
    S->top = S->top->next;  /*使得栈顶指针下移一位,指向后一结点*/
    free(p);    /*释放结点p*/
    S->count--;
    return OK;
}

其他代码:

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /*  存储空间初始分配量 */

typedef int Status;
typedef int SElemType; /* SElemType 类型根据实际情况而定,这里假设为 int */

/*构造一个空栈S*/
Status InitStack(LinkStack *S)
{
    S->top = (LinkStackPtr)malloc(sizeof(StackNode));
    if (!S->top)
        return ERROR;
    S->top = NULL;
    S->count = 0;
    return OK;
}
/*把S置为空栈*/
Status ClearStack(LinkStack *S)
{
    LinkStackPtr p, q;
    p = S->top;
    while (p)
    {
        q = p;
        p = p->next;
        free(q);
    }
    S->count = 0;
    return OK;
}

/* 若栈S为空栈,则返回TRUE,否则返回FALSE*/
Status StackEmpty(LinkStack S)
{
    if (S.count == 0)
        return TRUE;
    else

        return FALSE;
}

/* 返回S的元素个数,即栈的长度*/
int StackLength(LinkStack S)
{
    return S.count;
}

/* 若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK;否则返回 ERROR */
Status GetTop(LinkStack S, SElemType *e)
{
    if (S.top == NULL)
        return ERROR;
    else
        *e = S.top->data;
    return OK;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章