`
yangzhizhen
  • 浏览: 75558 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

数据结构之栈(C实现)

    博客分类:
  • C
阅读更多
  • 数据结构中的栈是什么

举一个简单的例子:在往箱子里面放衣物的时候,放在最上面的衣物总是我们最后放上去的;而当我们从箱子里取出衣物的时候,总是最先拿出上面的。这就是现实生活中的栈。

准确的讲,栈就是一种可以实现“先进后出(或者叫后进先出)”的存储结构。

学过数据结构的人都知道:栈可以用两种方式来实现,一种方法是用数组实现栈,这种栈成为静态栈;另外一种方法是用链表实现栈,这种栈叫做动态栈。

栈中通常存放着程序的局部变量等。栈通常有出栈和入栈操作。

  • 栈的结构

空栈的结构:【其实就是栈顶和栈顶都指向一个无用的头结点】

 

存有结点的栈结构:【栈顶指针指向栈顶结点,栈底指针指向头结点】

 

  • 栈的实现

下面是用C实现的一个栈结构的源码及详细注释:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//定义结点结构体
typedef struct Node
{
 int data;    //内容
 struct Node * pNext; //指向下一结点的指针
} NODE, * PNODE;   //NODE等价于struct Node, PNODE等价于struct Node *
//定义栈的结构体
typedef struct Stack
{
 PNODE pTop;    //栈顶结点
 PNODE pBottom;   //栈底结点
} STACK, * PSTACK;   //STACK等价于struct Stack, PSTACK等价于struct Stack *
//函数声明
void initStack(PSTACK pStack);    //对栈进行初始化的函数
void pushStack(PSTACK pStack, int val);  //入栈的函数
bool popStack(PSTACK pStack, int * pVal);//出栈的函数,*pVal用来保存出栈的元素内容
void traverseStack(PSTACK pStack);   //遍历栈的函数
bool isEmpty(PSTACK pStack);    //判断栈是否为空的函数
void clearStack(PSTACK pStack);   //清空栈的函数
int main(void)
{
 STACK stack;   //定义一个栈变量,STACK等价于struct Stack
 int val;    //用来保存出栈的内容
 initStack(&stack);  //调用栈的初始化函数
 pushStack(&stack, 10); //调用入栈的函数
 pushStack(&stack, 20);
 pushStack(&stack, 30);
 pushStack(&stack, 50);
 traverseStack(&stack); //调用遍历栈的函数
 //调用出栈的函数
 if(popStack(&stack, &val))
  printf("出栈成功,出栈的元素值为:%d\n", val);
 else
  printf(" 出栈失败!");
 //调用清空栈的函数
 clearStack(&stack);
 traverseStack(&stack); //调用遍历栈的函数
 system("pause");
 return 0;
}

void initStack(PSTACK pStack)
{
 //创建一个空结点,让pTop指向它
 pStack->pTop = (PNODE)malloc(sizeof(NODE));
 if(NULL != pStack->pTop)
 {
  //将pBottom也指向空节点
  pStack->pBottom = pStack->pTop;
  //清空空结点的指针域
  pStack->pTop->pNext = NULL;

 }
 else      //如果内存分配失败
 {
  printf("内存分配失败!程序退出!\n");
  exit(-1);
 }
 return;
}

void pushStack(PSTACK pStack, int val)
{
 //动态创建一个新结点
 PNODE pNew = (PNODE)malloc(sizeof(NODE));
 //设置新结点的数据域的值
 pNew->data = val;
 //将新结点的指针域指向之前建的空节点
 pNew->pNext = pStack->pTop;   //pStack->pTop不能换成pStack->pBottom
 //pTop指向新的结点
 pStack->pTop = pNew;
 return;
}

bool popStack(PSTACK pStack, int * pVal)
{
 if(isEmpty(pStack))
 {
  return false;
 }
 else
 {
  //先保存栈顶元素的地址,然后将pTop指向下一元素,最后释放之前栈顶元素的内存
  PNODE rNode = pStack->pTop;
  *pVal = rNode->data;
  pStack->pTop = rNode->pNext;
  free(rNode);
  rNode = NULL;
  return true;
 }

}

void traverseStack(PSTACK pStack)
{
 //将栈顶赋给一个临时结点,因为在遍历栈的时候不能销毁栈
 PNODE pNode = pStack->pTop;
 //循环遍历栈,直到栈底
 while(pStack->pBottom != pNode )
 {
  printf("%d  ", pNode->data);
  pNode = pNode->pNext;
 }
 printf("\n");
 return;
}

bool isEmpty(PSTACK pStack)
{
 if(pStack->pTop == pStack->pBottom)
  return true;
 else
  return false;
}

void clearStack(PSTACK pStack)
{ //栈为空,则退出该函数
 if(isEmpty(pStack))
 {
  return;
 }
 else
 { 
  //两个结点指针变量用来释放栈中元素的内存
  PNODE p = pStack->pTop;
  PNODE q = NULL;
  //循环释放内存
  while(p != pStack->pBottom)
  {
   q = p->pNext;
   free(p);
   p = q;
  }
  //将栈顶和栈底指向同一个指针域为空的结点
  pStack->pTop = pStack->pBottom;
  return;
 }
}

 

 

  • 栈的典型应用

生产消费模型常用栈来实现。生产者生产的东西都放入栈中,然后消费者从栈中依次取出东西,当栈顶和栈底指向都指向首结点时,生产的东西就被消耗光了。

分享到:
评论

相关推荐

    数据结构-栈的C语言实现

    数据结构-栈的C语言实现,随手笔记

    数据结构——栈 的 C语言 实现代码

    栈是一种非常基础且重要的数据结构,被广泛应用于各种算法和程序设计中。本文将深入探讨栈的C语言实现,帮助读者理解栈的工作原理及其在实际编程中的应用。 栈被称为“后进先出”(Last In First Out, LIFO)的数据...

    数据结构 栈的实现(c语言版)

    在本主题中,我们将深入探讨数据结构中的一个重要组成部分——栈,并以C语言为实现平台。栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)的原则,即最后进入的元素最先被移出。 栈的基本操作通常包括: 1. ...

    c语言实现的数据结构中的栈

    总结来说,使用C语言实现数据结构中的栈涉及定义结构体、初始化栈、实现基本操作(压栈、弹栈、查顶)以及可能的内存管理(扩容和缩容)。这个过程不仅加深了对数据结构的理解,也为编写高效、可靠的代码提供了基础...

    C语言-数据结构-栈队列实现

    本主题关注的是如何使用C语言来实现数据结构中的栈和队列,这是两种基础但非常重要的抽象数据类型(ADT)。 栈(Stack)是具有后进先出(LIFO)特性的数据结构。它类似于一个堆叠的盘子,最新的元素被放在顶部,...

    c语言数据结构用栈实现四则运算

    在本项目“C语言数据结构用栈实现四则运算”中,开发者利用栈这种数据结构来处理数学中的四则运算,包括加法(+)、减法(-)、乘法(*)和除法(/)。这种方法相比传统的递归或循环方式,通常更加简洁且易于理解。...

    数据结构之栈的实现.rar

    在本项目“数据结构之栈的实现”中,我们将深入探讨栈的概念、性质及其在编程中的应用,并结合VS2010环境下的实现方法。 栈的基本操作包括压入(Push)元素到栈顶和弹出(Pop)栈顶元素。在计算机科学中,栈常用于...

    数据结构中栈的C语言实现

    ### 数据结构中栈的C语言实现 #### 一、引言 栈是一种常见的线性数据结构,具有后进先出(LIFO, Last In First Out)的特点。在计算机科学领域,栈的应用非常广泛,比如函数调用时的局部变量存储、括号匹配问题等。...

    数据结构 栈操作 C语言实现

    本项目“数据结构 栈操作 C语言实现”提供了C语言编写的栈操作代码,体现了对栈的基本理解和应用。 栈的操作通常包括以下几个基本元素: 1. **初始化栈**:创建一个新的空栈,通常涉及分配内存空间以存储栈中的...

    栈实现计算器(C语言实现)

    本篇将详细介绍如何使用C语言实现一个基于栈的计算器。 首先,我们需要理解栈的基本操作:入栈(push)、出栈(pop)、查看栈顶元素(peek)以及检查栈是否为空(isEmpty)。在我们的计算器中,主要会用到两个栈,...

    数据结构顺序栈验证实验报告.pdf

    数据结构中的顺序栈是一种特殊的线性表,它具有后进先出(LIFO)的特点,即...通过设计和实现顺序栈的基本操作,学生能够更好地掌握数据结构的原理和应用,而数制转换问题则进一步巩固了对数值计算和算法设计的理解。

    数据结构中关于栈c语言源码

    在这个“数据结构中关于栈C语言源码”的主题里,我们将深入探讨栈的概念,C语言实现栈的原理,以及如何通过给定的`stack.c`文件来理解和学习栈的编程实践。 首先,栈是一个线性数据结构,其主要操作包括压栈(Push...

    数据结构——顺序栈的C语言实现

    顺序栈是其中最基础且重要的数据结构之一,常被用于处理需要“后进先出”(Last In First Out, LIFO)逻辑的问题。本文将深入探讨顺序栈的概念,并通过C语言来实现它。 顺序栈是一种线性数据结构,它的元素在内存中...

    数据结构-栈的实现代码(C语言版).rar

    数据结构 -- C语言版 -- 栈的部分实现代码(栈的实现、栈的应用),详细介绍参考数据结构--栈的系列博文。链接为:https://blog.csdn.net/songshuai0223/category_9742561.html。

    数据结构及算法C语言实现代码集

    这个"数据结构及算法C语言实现代码集"是一个宝贵的资源,它涵盖了多种常用的数据结构和算法,可以帮助程序员深入学习和实践。 首先,数据结构主要包括数组、链表、栈、队列、树、图等。数组是最基本的数据结构,它...

    数据结构C语言实现栈和队列的基本操作

    本项目重点探讨了两种基本数据结构——栈(Stack)和队列(Queue),并使用C语言进行了实现。C语言是一种底层编程语言,适合进行这种底层数据结构的构建,因为它提供了对内存管理的直接控制。 栈是一种后进先出...

    C语言数据结构库(队列,栈,链表,树的增删改查)

    这些数据结构的C语言实现通常涉及以下技术: - 指针操作:通过指针实现节点间的连接。 - 动态内存分配:使用`malloc`和`free`函数分配和释放内存。 - 结构体:定义数据结构来封装节点信息。 - 循环和条件判断:在...

    数据结构源代码C语言实现

    本资源“数据结构源代码C语言实现”提供了一套完整的C语言实现数据结构的代码库,涵盖了各种基本的数据结构类型。 1. **顺序表**:顺序表是最基础的数据结构之一,它在内存中连续存储元素。在C语言中,我们通常用...

    基本数据结构及算法 c语言实现

    本资源“基本数据结构及算法 c语言实现”提供了一套经典的C语言实现,帮助学习者深入理解和掌握这些核心概念。 数据结构是组织、管理和存储数据的方式,它为数据的高效访问和操作提供了便利。以下是一些常见的数据...

Global site tag (gtag.js) - Google Analytics