> 文档中心 > 链栈的实现

链栈的实现

链栈的实现:

      • 结构体:
      • 栈的相关操作
      • 主函数:
      • 初始化链栈:
      • 入栈操作:
      • 出栈操作:
      • 判断栈是否为空:
      • 输出栈中数据
      • 获取元素数量:

(栈具有先进后出的特点,只能在栈顶进行数据操作(入栈和出栈只能在栈顶进行))
1、本程序带有头结点
2、当有新结点入栈从头部插入数据
3、当需要删除结点时也从头部删除

结构体:

#include #include typedef struct Stack{    int val;     //存储数据    struct Stack *Next; //指向下一结点    int nums;  //元素数量}Stack_Node;

栈的相关操作:

Stack_Node *InitStack();  //初始化链栈void Push(Stack_Node *stack,int val);   //入栈操作int Pop(Stack_Node *stack);      //出栈操作boolean isEmpty(Stack_Node *stack);     //判断栈是否为空void show(Stack_Node *stack);    //显示栈中数据元素int GetNums(Stack_Node *stack);   //获取栈中元素数量

主函数:

#include "stack.h"void main(){    Stack_Node *stack;    stack = InitStack();    int val ;//保存入栈数据    int opt = 1;    //操作选择    while(opt)    { printf("----------------------------------\n"); printf("1、入栈操作   2、出栈操作    \n"); printf("3、显示数据   4、获取元素数量\n"); printf("5、退出      \n"); printf("----------------------------------\n"); printf("请输入操作代号:"); scanf("%d",&opt); switch(opt) {     case 1:  printf("请输入入栈数据:\n");  scanf("%d",&val);  Push(stack,val);  break;     case 2:  printf("数据出栈:\n");  int data = Pop(stack);  printf("出栈数据为:\t%d\n",data);  break;     case 3:  printf("显示数据:\n");  show(stack);  break;     case 4:  printf("获取元素数量为:\n");  int num = GetNums(stack);  printf("元素数量为:\t%d\n",num);  break;     case 5:  printf("退出系统\n");  opt = 0;  exit(-1);     default:  printf("输入有误,请重新输入1~5之间的数字\n");  break ; }    }    system("pause");    return ;}

初始化链栈:

Stack_Node *InitStack(){    Stack_Node *node = (Stack_Node *)malloc(sizeof(Stack_Node));    if(node == NULL)    { printf("内存申请失败...\n"); exit(-1);    }    node->val = 0;    node->Next = NULL;    node->nums = 0;    return node;}

入栈操作:

void Push(Stack_Node *stack,int val){    //采用头部入栈的方法    Stack_Node *tmp = (Stack_Node *)malloc(sizeof(Stack_Node)); //申请新的结点空间    if(tmp == NULL)    { printf("内存申请失败"); return ;    }    tmp->val = val;      //保存传入的数据    tmp->Next = stack->Next;    //新结点指向头结点指向的下一元素    stack->Next = tmp;   //头结点指向新结点    stack->nums ++;      //元素数量加 1}

在这里插入图片描述

出栈操作:

int Pop(Stack_Node *stack){    //判断栈中是否有结点存在    if(isEmpty(stack))    { printf("栈为空\n"); return -1;    } Stack_Node* delete = stack->Next;//辅助结点栈顶结点    int del_data = delete->val;      //获取栈顶结点的数据    stack->Next = delete->Next;      //头结点指向栈顶元素的下一结点    stack->nums --;    //栈中元素数量减 1    free(delete);      //释放结点空间    return del_data;    }

在这里插入图片描述

判断栈是否为空:

oolean isEmpty(Stack_Node *stack){    //栈中元素数量为 0 或者头结点指向为空时栈为空    if(stack->nums == 0 || stack->Next == NULL) return TRUE;    return FALSE;}

输出栈中数据:

void show(Stack_Node *stack){    Stack_Node *node = stack->Next;    while(node)    { printf("栈中元素为:%d\t\n",node->val); node =  node->Next;    }}

在这里插入图片描述

获取元素数量:

int GetNums(Stack_Node *stack){    return stack->nums;}

在这里插入图片描述

说明:此文章为学习笔记,如有侵权联系删除。