• C语言用链表实现一个栈


    目前在学数据结构,所以就相当于做笔记了,希望对大家有帮助。

    栈大家都很熟悉,这里就不啰嗦了。

    在头文件中关于栈和链表的定义,整个的链表是LinkStack, 里面存储的元素top就是节点,这样分开存的好处是方便理解和后期修改

    1. #include
    2. #include
    3. #include
    4. struct LNode{
    5. int data; // 栈的数据
    6. LNode* next; // 指向下一个节点
    7. };
    8. struct LinkStack{
    9. LNode* top;
    10. int len; // 存储栈的长度
    11. int maxlen; // 栈的最大长度
    12. };

    创建一个栈,值得注意的是len之必须提前赋为-1,保证我们的maxlen数值准确,防止出现最大值是5,但是实际上只能存4个节点的情况

    1. // 创建一个栈
    2. LinkStack* Create(int maxlen){
    3. LinkStack* ls = (LinkStack*)malloc(sizeof(LinkStack));
    4. ls->top = NULL;
    5. ls->len = -1;
    6. ls->maxlen = maxlen;
    7. return ls;
    8. }

    将栈置空,直接把len修改即可,这里(偷懒)就不free了。

    1. // 将栈置空
    2. void FreeAll(LinkStack* ls){
    3. ls->len = -1;
    4. }

    断栈是否为空

    1. // 判断栈是否为空
    2. bool IsEmpty(LinkStack* ls){
    3. return ls->len <= 0;
    4. }

    判断栈是否已满

    1. // 判断栈是否已满
    2. bool IsFull(LinkStack* ls){
    3. return ls->len == ls->maxlen;
    4. }

    将数据入栈,需要注意一定是头插法,栈只有一个入口

    1. // 将x压入栈
    2. bool push(LinkStack* ls, int x){
    3. if(IsFull(ls)){
    4. printf("栈已满!");
    5. return false;
    6. }
    7. LNode* newNode = (LNode*)malloc(sizeof(LNode));
    8. newNode->data = x;
    9. newNode->next = ls->top;
    10. ls->top = newNode;
    11. ls->len++;
    12. return true;
    13. }

    将栈顶元素出栈,不能提供中间删除的方法,因为栈只有一个出口

    1. // 将栈顶元素出栈
    2. bool pop(LinkStack* ls){
    3. if(IsEmpty(ls)){
    4. printf("栈为空!");
    5. return false;
    6. }
    7. LNode* tool = ls->top;
    8. ls->top = tool->next;
    9. ls->len--;
    10. return true;
    11. }

    获取栈顶元素,这个方法可以和出栈写在一起,即出栈的时候顺便获取这个元素值

    1. // 获取栈顶元素
    2. int getTop(LinkStack* ls){
    3. return ls->top->data;
    4. }

    打印栈内的所有元素,限于单链表的原因,这里只能反过来打印,即从栈顶打印到栈底。也可以把链表换成双链表

    1. // 打印栈的所有元素
    2. void printAll(LinkStack* ls){
    3. LNode* tool = ls->top;
    4. while(tool){
    5. printf("%d ", tool->data);
    6. tool = tool->next;
    7. }
    8. }

    最后的主函数,简单测试一下。

    1. int main(){
    2. int i = 0, n = 0;
    3. LinkStack* ls = Create(5);
    4. while(i < 7){
    5. scanf("%d", &n);
    6. if(!push(ls,n)){
    7. break;
    8. }
    9. i++;
    10. }
    11. printf("\n");
    12. pop(ls);
    13. printAll(ls);
    14. return 0;
    15. }

    有什么问题可以直接私信我呀~~~~~

    希望和诸君共勉

  • 相关阅读:
    RocketMQ源码分析(十二)之CommitLog同步与异步刷盘
    谁家面试往死里问 Swagger 啊?
    Item 38: Be aware of varying thread handle destructor behavior.
    《实现领域驱动设计》-聚合
    COO、CSR、adj_coo、adj_csr详解:稀疏矩阵与稀疏邻接矩阵的存储格式及转换
    LINUX系统编程:基于环形队列和信号量的生产者消费者模型
    Windows端使用命令启动Natapp
    引用特定条件下的第一条数据
    【Spring Bean 生命周期】
    golang常用方法
  • 原文地址:https://blog.csdn.net/qq_61567032/article/details/126817888