链栈

  1. #ifndef LISTACK_H_INCLUDED   
  2. #define LISTACK_H_INCLUDED   
  3.   
  4. typedef char ElemType;  
  5. typedef struct linknode  
  6. {  
  7.     ElemType data;              //数据域  
  8.     struct linknode *next;      //指针域  
  9. } LiStack;                      //链栈类型定义  
  10.   
  11. void InitStack(LiStack *&s);  //初始化栈  
  12. void DestroyStack(LiStack *&s);  //销毁栈  
  13. int StackLength(LiStack *s);  //返回栈长度  
  14. bool StackEmpty(LiStack *s);  //判断栈是否为空  
  15. void Push(LiStack *&s,ElemType e);  //入栈  
  16. bool Pop(LiStack *&s,ElemType &e);  //出栈  
  17. bool GetTop(LiStack *s,ElemType &e);  //取栈顶元素  
  18. void DispStack(LiStack *s);  //输出栈中元素  
  19.   
  20.   
  21. #endif // LISTACK_H_INCLUDED  
  22. 1  
  23.   2.源文件:listack.cpp,包含实现各种算法的函数的定义  
  24.   
  25. #include <stdio.h>   
  26. #include <malloc.h>   
  27. #include "listack.h"   
  28.   
  29. void InitStack(LiStack *&s)  //初始化栈  
  30. {  
  31.     s=(LiStack *)malloc(sizeof(LiStack));  
  32.     s->next=NULL;  
  33. }  
  34.   
  35. void DestroyStack(LiStack *&s)  //销毁栈  
  36. {  
  37.     LiStack *p=s->next;  
  38.     while (p!=NULL)  
  39.     {  
  40.         free(s);  
  41.         s=p;  
  42.         p=p->next;  
  43.     }  
  44.     free(s);    //s指向尾结点,释放其空间   
  45. }  
  46.   
  47. int StackLength(LiStack *s)  //返回栈长度  
  48. {  
  49.     int i=0;  
  50.     LiStack *p;  
  51.     p=s->next;  
  52.     while (p!=NULL)  
  53.     {  
  54.         i++;  
  55.         p=p->next;  
  56.     }  
  57.     return(i);  
  58. }  
  59.   
  60. bool StackEmpty(LiStack *s)  //判断栈是否为空  
  61. {  
  62.     return(s->next==NULL);  
  63. }  
  64.   
  65. void Push(LiStack *&s,ElemType e)  //入栈  
  66. {  
  67.     LiStack *p;  
  68.     p=(LiStack *)malloc(sizeof(LiStack));  
  69.     p->data=e;              //新建元素e对应的节点*p  
  70.     p->next=s->next;        //插入*p节点作为开始节点  
  71.     s->next=p;  
  72. }  
  73.   
  74. bool Pop(LiStack *&s,ElemType &e)  //出栈  
  75. {  
  76.     LiStack *p;  
  77.     if (s->next==NULL)      //栈空的情况  
  78.         return false;  
  79.     p=s->next;              //p指向开始节点  
  80.     e=p->data;  
  81.     s->next=p->next;        //删除*p节点  
  82.     free(p);                //释放*p节点   
  83.     return true;  
  84. }  
  85.   
  86. bool GetTop(LiStack *s,ElemType &e)  //取栈顶元素  
  87. {  
  88.     if (s->next==NULL)      //栈空的情况  
  89.         return false;  
  90.     e=s->next->data;  
  91.     return true;  
  92. }  
  93.   
  94. void DispStack(LiStack *s)  //输出栈中元素  
  95. {  
  96.     LiStack *p=s->next;  
  97.     while (p!=NULL)  
  98.     {  
  99.         printf("%c ",p->data);  
  100.         p=p->next;  
  101.     }  
  102.     printf("\n");  
  103. }  
  104. 1  
  105.   3.在同一项目(project)中建立一个源文件(如main.cpp),编制main函数,完成相关的测试工作。 例:  
  106.   
  107. #include <stdio.h>   
  108. #include "listack.h"   
  109.   
  110. int main()  
  111. {  
  112.     ElemType e;  
  113.     LiStack *s;  
  114.     printf("(1)初始化链栈s\n");  
  115.     InitStack(s);  
  116.     printf("(2)链栈为%s\n",(StackEmpty(s)?"空":"非空"));  
  117.     printf("(3)依次进链栈元素a,b,c,d,e\n");  
  118.     Push(s,'a');  
  119.     Push(s,'b');  
  120.     Push(s,'c');  
  121.     Push(s,'d');  
  122.     Push(s,'e');  
  123.     printf("(4)链栈为%s\n",(StackEmpty(s)?"空":"非空"));  
  124.     printf("(5)链栈长度:%d\n",StackLength(s));  
  125.     printf("(6)从链栈顶到链栈底元素:");DispStack(s);  
  126.     printf("(7)出链栈序列:");  
  127.     while (!StackEmpty(s))  
  128.     {   Pop(s,e);  
  129.         printf("%c ",e);  
  130.     }  
  131.     printf("\n");  
  132.     printf("(8)链栈为%s\n",(StackEmpty(s)?"空":"非空"));  
  133.     printf("(9)释放链栈\n");  
  134.     DestroyStack(s);  
  135.     return 0;  
  136. }  
#ifndef LISTACK_H_INCLUDED
#define LISTACK_H_INCLUDED

typedef char ElemType;
typedef struct linknode
{
    ElemType data;              //数据域
    struct linknode *next;      //指针域
} LiStack;                      //链栈类型定义

void InitStack(LiStack *&s);  //初始化栈
void DestroyStack(LiStack *&s);  //销毁栈
int StackLength(LiStack *s);  //返回栈长度
bool StackEmpty(LiStack *s);  //判断栈是否为空
void Push(LiStack *&s,ElemType e);  //入栈
bool Pop(LiStack *&s,ElemType &e);  //出栈
bool GetTop(LiStack *s,ElemType &e);  //取栈顶元素
void DispStack(LiStack *s);  //输出栈中元素


#endif // LISTACK_H_INCLUDED
1
  2.源文件:listack.cpp,包含实现各种算法的函数的定义

#include <stdio.h>
#include <malloc.h>
#include "listack.h"

void InitStack(LiStack *&s)  //初始化栈
{
    s=(LiStack *)malloc(sizeof(LiStack));
    s->next=NULL;
}

void DestroyStack(LiStack *&s)  //销毁栈
{
    LiStack *p=s->next;
    while (p!=NULL)
    {
        free(s);
        s=p;
        p=p->next;
    }
    free(s);    //s指向尾结点,释放其空间
}

int StackLength(LiStack *s)  //返回栈长度
{
    int i=0;
    LiStack *p;
    p=s->next;
    while (p!=NULL)
    {
        i++;
        p=p->next;
    }
    return(i);
}

bool StackEmpty(LiStack *s)  //判断栈是否为空
{
    return(s->next==NULL);
}

void Push(LiStack *&s,ElemType e)  //入栈
{
    LiStack *p;
    p=(LiStack *)malloc(sizeof(LiStack));
    p->data=e;              //新建元素e对应的节点*p
    p->next=s->next;        //插入*p节点作为开始节点
    s->next=p;
}

bool Pop(LiStack *&s,ElemType &e)  //出栈
{
    LiStack *p;
    if (s->next==NULL)      //栈空的情况
        return false;
    p=s->next;              //p指向开始节点
    e=p->data;
    s->next=p->next;        //删除*p节点
    free(p);                //释放*p节点
    return true;
}

bool GetTop(LiStack *s,ElemType &e)  //取栈顶元素
{
    if (s->next==NULL)      //栈空的情况
        return false;
    e=s->next->data;
    return true;
}

void DispStack(LiStack *s)  //输出栈中元素
{
    LiStack *p=s->next;
    while (p!=NULL)
    {
        printf("%c ",p->data);
        p=p->next;
    }
    printf("\n");
}
1
  3.在同一项目(project)中建立一个源文件(如main.cpp),编制main函数,完成相关的测试工作。 例:

#include <stdio.h>
#include "listack.h"

int main()
{
    ElemType e;
    LiStack *s;
    printf("(1)初始化链栈s\n");
    InitStack(s);
    printf("(2)链栈为%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(3)依次进链栈元素a,b,c,d,e\n");
    Push(s,'a');
    Push(s,'b');
    Push(s,'c');
    Push(s,'d');
    Push(s,'e');
    printf("(4)链栈为%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(5)链栈长度:%d\n",StackLength(s));
    printf("(6)从链栈顶到链栈底元素:");DispStack(s);
    printf("(7)出链栈序列:");
    while (!StackEmpty(s))
    {   Pop(s,e);
        printf("%c ",e);
    }
    printf("\n");
    printf("(8)链栈为%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(9)释放链栈\n");
    DestroyStack(s);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值