栈的链式存储结构

1 链式存储结构
  栈的链式存储结构,简称链栈。
  由于栈只是栈顶在做插入和删除操作,所以栈顶应该放在单链表的头部。另外,都有了栈顶在头部了,单链表中的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的。

  对于链栈来说,基本不存在栈满的情况,除非内存已经没有使用空间了。
  对于空栈来说,链表原来的定义是头指针指向空,那么链栈的空其实就是top=NULL。

 链栈的结构代码如下:

typedef struct StackNode {
    SElemType data;
    Struct StackNode *next;
}StackNode;
typedef
struct StackNode *LinkStackPtr; typedef struct LinkStack { LinkStackPtr top;
int count; }LinkStack;


2 进栈操作

 

Status push(LinkStack *S, SElemType e) {

    LinkStackPtr node = (LinkStackPtr)malloc(sizeof(StackNode));
    node->data = e;
    node->next = S->top;

    S->top = node;
    S->count ++;

    return OK;
}


3 出栈操作

Status pop(LinkStack *S, SElemType *e) {

    LinkStackPtr p;

    if (S->top == NULL) {
        return ERROR;
    }

    *e = S->top->data;
    p = S->top;

    S->top = S->top->next;
    S->count --;

    free(p);            //释放结点p

    return OK;
}


4 对比顺序栈和链栈

  顺序栈和链栈的时间复杂度都为O(1). 如果栈的使用过程中元素变化不可预期,有时会很大,有时会很小,则选择使用链栈。反之,如果它的变化在可控范围内,选择使用顺序栈比较好。

posted @ 2016-07-06 15:26  紫洁  阅读(6929)  评论(0编辑  收藏  举报