使用链表实现栈(C语言)

下边的实现,默认在链栈中设置一个头结点,用于指向栈的第一个元素

链栈结构体定义

typedef char DataType;
typedef struct node{
    DataType data;
    struct node *next;        
}LStackNode,*LinkStack;

链栈算法实现

void InitStack(LinkStack *top){
     // 为头结点分配存储单元
     if((*top=(LinkStack)malloc(sizeof(LStackNode)))==NULL){
         exit(-1);  
     }
     // 将头结点的指针域置为空
     (*top)->next = NULL;
}
// 判断栈是否为空
int StackEmpty(LinkStack top){
    if(top->next == NULL){
         return 1;
    }else{
         return 0;      
    }
}
// 将元素入栈:需要为入栈的结点分配内存
int PushStack(LinkStack top,DataType e){
    LStackNode *p;
    if((p=(LStackNode*)malloc(sizeof(LStackNode)))==NULL){
         printf("内存分配失败\n");
         return 0;
    }
    p->data = e;
    p->next = top->next;
    top->next = p;
    return 1;
}
// 将元素出栈:需要释放结点空间
int PopStack(LinkStack top,DataType *e){
    LStackNode *p;
    p = top->next;
    if(!p){
         printf("栈已空\n");
         return 0; 
    }
    top->next = p->next;
    *e = p->data;
    free(p);
    return 1;
}
// 取栈顶元素:需要对边界做判断(栈是否为空)
int GetTop(LinkStack top,DataType *e){
    LStackNode *p;
    p = top->next;
    if(!p){
         printf("栈已空\n");
         return 0; 
    }
    *e = p->data;
    return 1;
}
// 获取栈长度:因为需要头结点,依次寻找下一个结点,所以时间复杂度为:O(n)
int StackLength(LinkStack top){
    int i=0;
    LStackNode *p;
    p = top;
    if(p->next!=NULL){
         p = p->next;             
         i++;
    }
    return i;
}
// 销毁链栈:需要释放动态分配的结点空间
void DestoryStack(LinkStack top){
     LStackNode *p,*q;
     p = top;
     while(!p){
          q = p;
          p = p->next;
          free(q);
     }
}

应用

1 进制转换:例如十进制转八进制,不断除以8,保存余数,直到商为0,从下往上取余数。可以使用栈保存余数,再依次取出
2 括号配对:假如是括号的左边,就入栈;当遇到括号的右边,就出栈一个元素,比较是否配对;配对就继续上一步,不配对就退出

你可能感兴趣的:(使用链表实现栈(C语言))