zoukankan      html  css  js  c++  java
  • C语言实现数据结构中的链栈

    实现方式一
    # include <stdio.h>
    # include <stdlib.h>
    typedef char NodeData;
    //链栈
    typedef struct Node
    {
     NodeData data;
     struct Node *next;
    }StackNode;
    typedef struct
    {
     StackNode *top;
    }
    LinkStack;

    /*置栈空*/
    void initStack(LinkStack *ls)
    {
     ls->top=NULL;
    }
    /*判栈空*/
    int isStackEmpty(LinkStack *ls)
    {
     return ls->top==NULL;
    }
    /*进栈*/
    void pushStack(LinkStack *ls,NodeData nodedata)
    {
     StackNode *p;
     p=(StackNode *)malloc(sizeof(StackNode));
     p->data=nodedata;
     p->next=ls->top;
     ls->top=p;
    }
    /*出栈*/
    NodeData popStack(LinkStack *ls)
    {
     StackNode *p=ls->top;
     NodeData popNode=ls->top->data;
     ls->top=ls->top->next;
     free(p);
     return popNode;
    }

    /*打印栈*/
    void printStack(LinkStack *ls)
    {
        int i=0;
     StackNode *node;
     node=ls->top;
     while(node->next!=NULL)
     {
      node=node->next;
      printf("LinkStack Node %d is %c/n",i,node->data);
      i++;
     }
    }

    void main()
    {
     LinkStack *ls;
     char inData;
     ls=(LinkStack *)malloc(sizeof(LinkStack));
     initStack(ls);
     //入栈
        printf("Please input data/n");
        while(inData!='/n')
        {
       scanf("%c",&inData);
       pushStack(ls,inData);
       printf("push %c to stack/n",inData);
        }
     printf("print linkStack:/n");
     //打印栈元素
        printStack(ls);
     printf("pop stack/n");
     //出栈
     popStack(ls);
     printStack(ls);
     printf("pop stack/n");
     //出栈
     popStack(ls);
     printStack(ls);

    实现方式二
    只定义了栈节点
    # include <stdio.h>
    # include <stdlib.h>

    typedef char NodeData; //节点数据
    typedef struct Node
    {
     NodeData data;//节点数据
     struct Node * next;  //指向下一个节点的指针
    }StackNode;

    /*置栈空*/
    StackNode * initStack(StackNode *top)
    {
     top=NULL;
     return top;
    }
    /*入栈 (这里很容易出错,需要返回头接点的指针否则每次入参都是指向同一个接点的地址而不是头指针的地址)*/
    StackNode * pushStack(StackNode *top,NodeData nodedata)
    {
     StackNode *p;
     p=(StackNode *)malloc(sizeof(StackNode));
     p->data=nodedata;
     p->next=top;
     top=p;
     return top;
    }

    /*打印栈*/
    void printStack(StackNode *top)
    {
        int i=0;
     StackNode *node;
     node=top;
     while(node->next!=NULL)
     {
      node=node->next;
      printf("LinkStack Node %d is %c/n",i,node->data);
      i++;
     }
    }

    void main()
    {
     StackNode *top;
     NodeData inData;
     top=(StackNode *)malloc(sizeof(StackNode));
     top=initStack(top);
     printf("Please input data/n");
     while(inData!='/n')
     {
      scanf("%c",&inData);
      top=pushStack(top,inData);
      printf("push the %c to stack/n",inData);
     }
     printStack(top);
    }

    实现方式一 中LinkStack结构类型的定义是为了方便在函数体中修改top指针本身
    通过修改指向LinkStack的top指针来控制入栈和出栈.

    实现方式二 通过每次修改头指针并返回给入参来控制入栈和出栈.

    方式一是通过指针参数修改指针所指内容的典型用法.
    方式二是通过函数返回值改变入参内容的典型用法。

  • 相关阅读:
    matplotlib数据可视化之柱形图
    xpath排坑记
    Leetcode 100. 相同的树
    Leetcode 173. 二叉搜索树迭代器
    Leetcode 199. 二叉树的右视图
    Leetcode 102. 二叉树的层次遍历
    Leetcode 96. 不同的二叉搜索树
    Leetcode 700. 二叉搜索树中的搜索
    Leetcode 2. Add Two Numbers
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/xiejava/p/15171483.html
Copyright © 2011-2022 走看看