张小五学算法与数据结构第六天:链栈

本文介绍了链栈的基本概念和特点,详细展示了链栈的基本运算,包括初始化、判空、入栈、出栈及取栈顶元素等核心操作,并通过代码实现了这些功能。
一、链表的概述

链栈和链表非常相似,唯一不同的是链栈的插入和删除操作均在链表头部上进行,链表尾部就是栈底。

二、链表的基本运算
链表的基本运算包括初始化,判空表,入栈,出栈,取栈顶元素,下面以代码的方式展现出来。
linkstack.h:
/*
作者:张小五
时间:2018年1月29日
*/
#ifndef LINKSTACK_H_
#define LINKSTACK_H_

#define maxsize 64 //栈的容量
#define TRUE 1
#define FALSE 0

#include "stdio.h"
#include "stdlib.h"

typedef struct node{
    int data; //数据区
    struct node *next; //指针
}linkStack,*linkTop; //链栈类型定义,定义指向链栈栈顶的指针top

void InitStack(linkTop top); //初始化栈
void PushStack(linkTop top,int x);//元素进栈
int PopStack(linkTop top,int *x);//元素出栈
int IsEmpty(linkTop top); //判空栈
void ShowTop(linkTop top); //取栈顶元素

#endif // LINKSTACK_H_
linkstack.c:
#include "stdio.h"
#include "stdlib.h"
#include "linkstack.h"

//初始化栈
void InitStack(linkTop top){
    top->next = NULL;
}
//判空表
int IsEmpty(linkTop top){
    return (top->next==NULL)?TRUE:FALSE;
}
//元素进栈
void PushStack(linkTop top,int x){
    linkTop P=(linkTop)malloc(sizeof(linkStack));
    P->data = x;
    P->next = top->next;
    top->next =P;
}

//元素出栈
int PopStack(linkTop top,int *x){
    if(IsEmpty(top)){
        return FALSE;
    }
    linkTop p = top->next; //定义辅助指针
    *x = p->data; //取出数据
    top->next = p->next;//栈顶下移
    free(p); //释放原栈顶结点
    return TRUE;

}
//取栈顶元素
void ShowTop(linkTop top){
    int x;
    if(!IsEmpty(top)){
        printf("栈顶元素为:%d\n",top->next->data);
    }
}
main.c:
/*
作者:张小五
时间:2018年1月29日
*/
#include "stdio.h"
#include "stdlib.h"
#include "linkstack.h"
#include "linkstack.c"

int main (int argc, char *argv[]){
    int x = 0;
    int i = 1;
    //初始化栈
    linkTop top=(linkTop)malloc(sizeof(linkStack));
    InitStack(top);

    //进栈
    while(x!=-1){
        printf("请输入第%d个元素(以-1结束):",i);
        scanf("%d",&x);
        if(x==-1){
            break;
        }
        PushStack(top,x);
        i++;
    }
    //打印栈顶元素
    ShowTop(top);
    //出栈
    printf("出栈顺序:\n");
    while(!IsEmpty(top)){
        PopStack(top,&x);
        printf("%d ",x);
    }
    return 0;
}
链栈的特点是它没有上溢的限制,它就像是一条一头固定的链子,可以活动的一头自由的增加结点而不会溢出,链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,反而使算法更加复杂,所以只要有链表的头指针就可以了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张小五丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值