C Datastructure 5 ---- stack

来源:互联网 发布:淘宝买东西受骗怎么办 编辑:程序博客网 时间:2024/06/04 19:38

栈(stack)也是最基本的额数据结构之一,其实也就是特殊化的表,也就是插入和弹出元素都是在栈顶(相当于线性表的表尾)。

自从我们了解了链表这个东东以后,最大的好处就是在也不用提前用数组分配内存了,随用随取(malloc),不用就释放(free)。

所以,栈的实现也可以分为两种,不过还有一种比较少见的双栈(double stack),就是两个栈使用同一块内存区域,两个stack的
top在这个内存区域的两端,后面有详细的数据结构,看下便知。

  • stack(预先分配内存,使用数组)
  • link stack(使用链表思想实现)
  • double stack

stack github参考源码
首先是使用数组实现的普通stack

typedef int ElementType;typedef struct{    ElementType data[MAX_SIZE];     int top; }stStack;void InitStack(stStack* stack);BOOL IsFullStack(stStack* stack);BOOL IsEmptyStack(stStack* stack);BOOL Push(stStack* stack, ElementType elem);BOOL Pop(stStack* stack, ElementType *elem);int GetLength(stStack* stack);

比较简单,不贴具体实现了,需要详细了解的点击上面链接下载github源码。

下一个是link stack 的实现。
数据结构和接口。

typedef int ElementType;typedef struct stStackNode{    ElementType data;    struct stStackNode* next;}stStackNode;typedef struct{    stStackNode* top;     int length;}stLinkStack;void InitStack(stLinkStack* stack);BOOL IsFullStack(stLinkStack* stack);BOOL IsEmptyStack(stLinkStack* stack);BOOL Push(stLinkStack* stack, ElementType elem);BOOL Pop(stLinkStack* stack, ElementType *elem);int GetLength(stLinkStack* stack);void ClearStack(stLinkStack* stack);

看下push 和 pop

BOOL Push(stLinkStack* stack, ElementType elem){    stStackNode* node = (stStackNode*)malloc(sizeof(stStackNode));    node->next = stack->top;    node->data = elem;    stack->top = node;    stack->length++;    return TRUE;}BOOL Pop(stLinkStack* stack, ElementType *elem){    stStackNode* delNode;    if(IsEmptyStack(stack))        return FALSE;    delNode = stack->top;    *elem = delNode->data;    stack->top = delNode->next;    free(delNode);    stack->length--;    return TRUE;}

最后一个是双栈(double stack),比较简单。
数据结构和接口。

typedef int ElementType;typedef struct{    ElementType data[MAX_SIZE];     int top1;    int top2; }stDoubleStack;void InitStack(stDoubleStack* stack);BOOL IsFullStack(stDoubleStack* stack);BOOL IsEmptyStack(stDoubleStack* stack);BOOL Push(stDoubleStack* stack,int stack_num, ElementType elem);BOOL Pop(stDoubleStack* stack, int stack_num, ElementType *elem);int GetLength(stDoubleStack* stack);

下面是具体实现

void InitStack(stDoubleStack* stack){    stack->top1 = -1;    stack->top2 = 1024;}BOOL IsFullStack(stDoubleStack* stack){    return (stack->top1+1 == stack->top2);}BOOL IsEmptyStack(stDoubleStack* stack){    return (stack->top1==-1 && stack->top2==1024);}BOOL Push(stDoubleStack* stack,int stack_num, ElementType elem){    if(IsFullStack(stack))        return FALSE;    if(stack_num==1)    {        stack->data[++stack->top1] = elem;        return TRUE;    }    else if(stack_num==2)    {        stack->data[--stack->top2] = elem;        return TRUE;    }    else        return FALSE;}BOOL Pop(stDoubleStack* stack, int stack_num, ElementType *elem){    if(stack_num==1)    {        if(stack->top1==-1)            return FALSE;        *elem = stack->data[stack->top1--];        return TRUE;    }    else if(stack_num==2)    {        if(stack->top2==1024)            return FALSE;        *elem = stack->data[stack->top2++];        return TRUE;    }    else        return FALSE;}int GetLength(stDoubleStack* stack){    return stack->top1+1 + 1024-stack->top2;}
0 0
原创粉丝点击