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

来源:互联网 发布:微信大屏幕霸屏源码 编辑:程序博客网 时间:2024/06/06 02:39

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

链栈结构体定义

typedef char DataType;typedef struct node{    DataType data;    struct node *next;        }LStackNode,*LinkStack;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

链栈算法实现

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

应用

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

0 0