【数据结构】链栈的基本操作C语言完整代码(初始化,判栈空,入栈,出栈,取栈顶元素,求栈长)

简介: 【数据结构】链栈的基本操作C语言完整代码(初始化,判栈空,入栈,出栈,取栈顶元素,求栈长)

链栈的基本操作C语言完整代码


一、初始化栈


链栈初始化即先构造一个空栈,将栈顶指针top所指的头结点的指针域置空。

//初始化
LinkedStack Init_LinkedStack()                                       
{ 
  LinkedStack top=(LinkedStackNode * )malloc (sizeof( LinkedStackNode));
  if(top!=NULL)//申请空间成功
  top->next=NULL;//设置栈顶指针为空
  return top;
}

二、判栈空


若栈顶指针top为空,则返回1,否则返回0。

//判栈空
int LinkedStack_Empty(LinkedStack top)                            
{ 
  if(top->next==NULL)//检查栈顶指针的值 
  {
    return 1;//栈S为空,函数返回1
  } 
  else
  {
    return 0;
  }
}

三、入栈


将数据元素X插入链栈的栈顶,将头结点的指针域指向新插入的栈顶元。插入成功返回1,否则返回0.

//入栈
int Push_LinkedStack(LinkedStack top,elemtype x)                     
  //插入数据元素x为新的栈顶元素
{ 
  LinkedStackNode * node;
  node=(LinkedStackNode * )malloc(sizeof(LinkedStackNode));
  if(node==NULL)
  {
    return 0;//申请结点空间失败,插入失败,函数返回0
  }
  else
  {
    node->data=x;//设置新结点的数据域
    node->next=top->next;//设置新结点的指针城
    top->next=node;//设置头结点指针城指向新的栈顶元素
    return 1;//插入成功,函数返回1
  }
}

四、出栈


删除栈顶数据元素,通过X返回删除数据的值,然后top指针指向下一个数据元素。删除成功返回1,否则返回0.

//出栈
int Pop_LinkedStack(LinkedStack top, elemtype *x)                    
{ LinkedStackNode * node;
  if(top->next==NULL)
  {
    return 0;
  }
  else
  {
    node=top->next;//将原栈顶数据元素弹出并赋给node
    *x=node->data;//将原栈顶数据元素的数据赋值给x
    top->next=node->next;//top指向链栈中的下一个数据元素
    free (node);//释放原栈顶数据元素所占的空间
    return 1;
  }
}  

五、取栈顶元素


读取栈顶元素,返回值。

//取栈顶元素
int GetTop_LinkedStack(LinkedStack top)                
{ 
  if(top->next)
      {
            return top->next->data;
      }
      return -1;
}

六、求栈长


设置计数器,随top指针后移,计数器加1,直到遍历完所有元素。

//求栈长
int Length_LinkedStack(LinkedStack top)                                       
{
  int count = 0;
  while(top->next!=NULL) 
  {
    ++count;
    top=top->next;
  }
  return count;
}

七、完整代码


#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct LinkedStackNode 
{ 
  elemtype data;
  struct LinkedStackNode * next;
} LinkedStackNode, * LinkedStack;                                  
  LinkedStack top;
//初始化
LinkedStack Init_LinkedStack()                                       
{ 
  LinkedStack top=(LinkedStackNode * )malloc (sizeof( LinkedStackNode));
  if(top!=NULL)//申请空间成功
  top->next=NULL;//设置栈顶指针为空
  return top;
}
//判栈空
int LinkedStack_Empty(LinkedStack top)                            
{ 
  if(top->next==NULL)//检查栈顶指针的值 
  {
    return 1;//栈S为空,函数返回1
  } 
  else
  {
    return 0;
  }
}
//入栈
int Push_LinkedStack(LinkedStack top,elemtype x)                     
  //插入数据元素x为新的栈顶元素
{ 
  LinkedStackNode * node;
  node=(LinkedStackNode * )malloc(sizeof(LinkedStackNode));
  if(node==NULL)
  {
    return 0;//申请结点空间失败,插入失败,函数返回0
  }
  else
  {
    node->data=x;//设置新结点的数据域
    node->next=top->next;//设置新结点的指针城
    top->next=node;//设置头结点指针城指向新的栈顶元素
    return 1;//插入成功,函数返回1
  }
}
//求栈长
int Length_LinkedStack(LinkedStack top)                                       
{
  int count = 0;
  while(top->next!=NULL) 
  {
    ++count;
    top=top->next;
  }
  return count;
}
//出栈
int Pop_LinkedStack(LinkedStack top, elemtype *x)                    
{ LinkedStackNode * node;
  if(top->next==NULL)
  {
    return 0;
  }
  else
  {
    node=top->next;//将原栈顶数据元素弹出并赋给node
    *x=node->data;//将原栈顶数据元素的数据赋值给x
    top->next=node->next;//top指向链栈中的下一个数据元素
    free (node);//释放原栈顶数据元素所占的空间
    return 1;
  }
}  
//取栈顶元素
int GetTop_LinkedStack(LinkedStack top)                
{ 
  if(top->next)
      {
            return top->next->data;
      }
      return -1;
}
//主函数
void main()
{
  int i,t,x,a[20];
  LinkedStack top=Init_LinkedStack();//初始化栈
  x=LinkedStack_Empty(top);//判栈空结果赋值给X
  if(x=0)
  {
    printf("栈为空\n");
  }
  printf("请依次输入5个数,开始入栈:\n");
  for(i=0;i<5;i++) 
  {
    scanf("%d",&a[i]);
    Push_LinkedStack(top,a[i]);
    x=GetTop_LinkedStack(top);
    if(x!=-1)
    {
      printf("当前栈顶元素为%d\n",x);
    }
  }
  printf("入栈结束\n");
  printf("栈长为%d\n",Length_LinkedStack(top));
  printf("开始出栈:\n");
  for (i=0;i<5;i++)
  {
    Pop_LinkedStack(top,&t);
        printf("%d",t);
  }
  printf("\n");
  printf("出栈后栈长为%d\n",Length_LinkedStack(top));
}

八、程序结果


目录
相关文章
|
20天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
103 9
|
19天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
60 16
|
19天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
70 8
|
22天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
49 4
|
22天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
39 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
12天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
28 6
|
1月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
36 10
|
25天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。