C语言实现栈(链式存储结构)

栈是一种特殊的线性表,它只能够先入后出,它可以用数组实现,即顺序存储方式,也可以用链式的存储结构。

下面,我用C语言实现栈(链式存储结构)的压入和弹出等操作,并把每个函数用打印输出的形式进行验证。

/*******************************************************************/
//描述:栈的链式存储结构的创建,插入,删除等基本操作的函数,以及对这些操作进行验证
//时间:2018.1.1  10:00.这是我进入2018年的第一个程序
//作者:Liu ZhenHua
//*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char SElemType;
typedef struct StackNode{   //定义一个节点
    SElemType data;
    struct StackNode *next;
}StackNode,*StackNodePtr;
typedef struct{
    StackNodePtr Top;       //栈的头指针,即栈顶
    int count;              //栈内的元素数目
}LinkStack,*LinkStackPtr;
Status GetTop(LinkStackPtr LS,SElemType *e);        //取出栈顶元素
Status LinkStackPush(LinkStackPtr LS,SElemType e);  //压栈
Status LinkStackPop(LinkStackPtr LS,SElemType *e);  //出栈
void InitLinkStack(LinkStackPtr SL);                //初始化链表
void PrintLinkStack(LinkStackPtr SL);               //顺序栈内元素
int GetCount(LinkStackPtr SL);                      //返回栈内元素数目
void printSL(void);                                 //打印一行分割线
int main()
{
    LinkStackPtr S;SElemType val,*pval;pval = &val;
    S = (LinkStackPtr)malloc(sizeof(LinkStack));
    S->Top = (StackNodePtr)malloc(sizeof(StackNode));

    S->Top->next = NULL;
    S->Top->data = 'a';
    S->count = 1;
    PrintLinkStack(S);
    printSL();
    if(LinkStackPush(S,'b'))printf("压栈成功!\n");          //压栈操作
    PrintLinkStack(S);
    printSL();
    if(GetTop(S,pval))printf("取出栈顶元素为:%c\n",*pval);  //取出栈顶元素
    printSL();
    if(LinkStackPop(S,pval))printf("出栈成功!出栈元素为: %c\n",*pval);     //出栈
    PrintLinkStack(S);
    printSL();
    ClearLinkStack(S);                                      //清空栈
    printf("清空整个栈!\n");
    PrintLinkStack(S);
    return 0;
}
/**********************************************/
//函数名:GeeTop
//描述  :取出栈顶元素
//参数  :链栈结构体指针,元素值指针
//返回值:状态值
/**********************************************/
Status GetTop(LinkStackPtr LS,SElemType *e){
    if(LS->count==0){
        return ERROR;       //空栈
    }
    *e = LS->Top->data;
    return OK;
}
/**********************************************/
//函数名:LinkStackPush(
//描述  : 压栈
//参数  :链栈结构体指针,元素值
//返回值:状态值
/**********************************************/
Status LinkStackPush(LinkStackPtr LS,SElemType e){
    StackNodePtr newNode;
    newNode = (StackNodePtr)malloc(sizeof(StackNode));
    newNode->data = e;
    newNode->next = LS->Top;
    LS->Top = newNode;
    LS->count++;
    return OK;
}
/**********************************************/
//函数名:LinkStackPop
//描述  : 出栈栈
//参数  :链栈结构体指针,元素值指针
//返回值:状态值
/**********************************************/
Status LinkStackPop(LinkStackPtr LS,SElemType *e){
    StackNodePtr p;
    if(LS->count==0){
        return ERROR;       //空表
    }
    *e = LS->Top->data;
    LS->count--;            //元素数目自减
    p = LS->Top;
    LS->Top = LS->Top->next;
    free(p);
    return OK;
}
/**********************************************/
//函数名: InitLinkStack
//描述  : 栈的初始化,头针指向空,表的数据元素为0
//参数  :链栈结构体指针
//返回值:状态值
/**********************************************/
void InitLinkStack(LinkStackPtr SL){
    SL->count = 0;
    SL->Top->next=NULL;
}
/**********************************************/
//函数名: ClearLinkStack
//描述  : 清空整个链表
//参数  :链栈结构体指针
//返回值:状态值
void ClearLinkStack(LinkStackPtr SL){
    int i,k;
    k = SL->count;
    StackNodePtr p;
    for(i = 0; i < k; i++){
        p = SL->Top;
        SL->Top = SL->Top->next;
        free(p);
    }
    SL->count = 0;

}
/**********************************************/
//函数名: PrintLinkStack
//描述  : 打印栈内元素
//参数  :链栈结构体指针
//返回值:无
/**********************************************/
void PrintLinkStack(LinkStackPtr SL){
   int k,i;SElemType val;
   k = SL->count;
   StackNodePtr p;
   p = SL->Top;
   for(i = 0; i < k; i++){
        val = p->data;
        p = p->next;
        printf("第%d个元素: %c\n",i+1,val);
   }
    printf("打印结束,共有%d个元素。\n",i);
}
/**********************************************/
//函数名: GetCount
//描述  : 返回栈内元素个数
//参数  :链栈结构体指针
//返回值:int型栈内元素数
/**********************************************/
int GetCount(LinkStackPtr SL){
   return SL->count;
}
/**********************************************/
//函数名: printSL
//描述  : 打印一行分割线Print Split Line
//参数  :结无
//返回值:无
//作者  :LiuZhenHua
/**********************************************/
void printSL(void){
    int i;
    for(i = 0; i < 20; i++){
        printf("-");
    }
    printf("\n");
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nwsuaf_huasir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值