#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Elementtype; // 定义数据类型 // 定义节点
typedef struct Node {
Elementtype Element;
struct Node * Next;
}NODE, *PNODE; // 定义栈结构体
typedef struct Stack {
PNODE PTOP; // 定义栈顶节点
PNODE PBOTTOM; // 定义栈底节点
}STACK,* PSTACK; // 函数声明
void InitStack(PSTACK Stack); // 初始化栈
void PushStack(PSTACK Stack, int val); // 入栈函数
void PopStack(PSTACK Stack,int *val); // 出栈函数
void TraverseStack(PSTACK Stack); // 遍历栈函数
bool IsEmpty(PSTACK Stack); // 判断栈是否为空函数
void ClearStack(PSTACK Stack); // 清空栈函数 // 主函数 int main() {
STACK Stack; // 创建一个栈变量
int val = ; // 定义一个变量
InitStack(&Stack); // 调用初始化栈函数
IsEmpty(&Stack); // 调用判断栈是否为空函数
PushStack(&Stack, ); // 调用入栈函数,把100推入栈中
PushStack(&Stack, );
PushStack(&Stack, );
PushStack(&Stack, );
PushStack(&Stack, );
PushStack(&Stack, );
IsEmpty(&Stack);
TraverseStack(&Stack); // 调用栈遍历函数
PopStack(&Stack, &val); // 调用出栈函数
TraverseStack(&Stack);
ClearStack(&Stack); // 调用清空栈函数
IsEmpty(&Stack);
return ;
} // 定义初始化栈函数
void InitStack(PSTACK Stack) {
PNODE PNew = (PNODE)malloc(sizeof(NODE)); // 新建一个节点
if (PNew == NULL) { // 判断内存是否分配成功
printf("新节点空间分配失败!\n");
exit(-);
}
Stack->PTOP = PNew; // 栈顶指针指向新节点
Stack->PBOTTOM = PNew; // 栈底指针指向新节点
PNew->Next = NULL; // 新节点指针指向为空
printf("栈创建成功!\n"); } // 定义入栈函数
// 从栈顶插入数值val
void PushStack(PSTACK Stack,int val) {
PNODE P = (PNODE)malloc(sizeof(NODE)); // 创建新的节点用于存放变量
if (P == NULL) {
printf("分配空间内存失败!");
exit(-);
}
P->Element = val; // 变量赋值给节点的数据域
P->Next=Stack->PTOP; // 让新建的节点指向上一个节点
Stack->PTOP = P; // 更新顶部节点,使其指向新建的节点
printf("%d 入栈成功!\n",val);
} // 定义出栈函数
// 从栈顶弹出,并将地址赋值给变量val
void PopStack(PSTACK Stack, int *val) {
if (Stack->PBOTTOM == Stack->PTOP) { // 判断栈是否为空
printf("出栈失败,栈为空!\n");
}
PNODE P = Stack->PTOP; // 建立一个临时节点指向栈顶节点
*val = P->Element; // 把栈顶节点元素弹出,地址放到变量val中
Stack->PTOP = P->Next; // 把栈顶指针指向上一个栈节点
free(P); // 释放节点内存,防止内存空间泄漏
P = NULL; // 防止产生野指针
printf("已将%d从栈弹出!\n", *val);
} // 定义判断栈是否为空函数
bool IsEmpty(PSTACK Stack) {
if (Stack->PBOTTOM == Stack->PTOP)
{
printf("栈为空!\n");
return true;
}
else
{
return false;
} } // 定义栈的遍历函数
void TraverseStack(PSTACK Stack) {
if (IsEmpty(Stack)) { // 判断栈是否为空
printf("遍历栈失败,栈为空!");
exit(-);
}
PNODE P = Stack->PTOP; // 建立一个临时节点指针,初始化时指向栈顶
//使临时节点指针从栈顶开始遍历栈,直到栈底
printf("遍历栈的结果为: ");
while (P != Stack->PBOTTOM) {
printf("%d ", P->Element); // 打印出数据
P = P->Next;
}
printf("\n"); } // 定义栈的清空函数 void ClearStack(PSTACK Stack) {
if (IsEmpty(Stack)) { // 判断栈是否为空
printf("栈已经为空,无需清空!\n");
exit(-);
}
// 创建两个节点指针用来释放栈
PNODE P = Stack->PTOP;
PNODE Q = NULL;
// 清空栈
while (P != Stack->PBOTTOM) {
Q = P->Next;
free(P);
P = Q;
}
Stack->PTOP = Stack->PBOTTOM; // 栈顶指向栈底指向的初始空节点
printf("已清空栈!\n");
}

运行结果

C语言描述栈的实现及操作(链表实现)的更多相关文章

  1. C语言描述栈的实现及操作(数组实现)

    一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...

  2. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  3. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  4. C语言描述二叉树的实现及操作(链表实现)

    概述     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...

  5. C语言描述队列的实现及操作(链表实现)

    // 队列的单链表实现 // 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方 // 首节点:头节点后第一个节点,存放数据 #include<stdio.h> #incl ...

  6. C语言描述队列的实现及操作(数组实现)

    一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...

  7. 【数据结构】之栈(C语言描述)

    栈(Stack)是编程中最常用的数据结构之一. 栈的特点是“后进先出”,就像堆积木一样,堆的时候要一块一块堆到最上面,拆的时候需要从最上面一块一块往下拆.栈的原理也一样,只不过它的操作不叫堆和拆,而是 ...

  8. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  9. 【数据结构】之栈(Java语言描述)

    在前面的[这篇文章]中,我简单介绍了栈这种数据结构的操作功能,并使用C语言对其进行了代码的编写. Java的JDK中默认为我们提供了栈这种数据结构的API—— Stack . Java中的Stack类 ...

随机推荐

  1. dojo中的xhrPost请求(JSON)

    dojo中的xhrPost请求 dojo.xhrPost({ url:"../area.action", content:{ areaCode:areaCode }, handle ...

  2. Flex中的FusionCharts 3D饼图

    1.3D饼图设计源码 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns: ...

  3. C# 对象数据转换Json帮助类 JsonHelp

    C# 对象数据转换Json帮助类 JsonHelp using System; using System.Data; using System.Configuration; using System. ...

  4. hihocoder Challenge 29 B.快速乘法

    这题的题解和我写的有一拼,异常简洁,爆炸. 这题思路dp 表示的是讨论到第位,并比原数的前n位多了 显然j只能取0,1,毕竟2进制嘛 之后转移就好了,注意下面两个重要状态 #include <c ...

  5. ASP.NET WebAPI String 传值问题

    如果我们再WebAPI中定义了只有一个string参数的WebAPI函数,如下所示: [HttpPost] public string TrackBill(string str) { return s ...

  6. visual studio编写C#代码时“未能从程序集.....中加载类型”和“找不到方法”的一种可能的解决办法

    编译前报错:$exception    {"未能从程序集"XSW.MySQLDAL, Version=1.0.0.0, Culture=neutral, PublicKeyToke ...

  7. HALCON学习-资料

    HALCON学习网: http://www.ihalcon.com/ 学习资料推荐博客: http://k594081130.blog.163.com/blog/static/218359013201 ...

  8. Python Cookbook(第3版)中文版:15.21 诊断分段错误

    15.21 诊断分段错误¶ 问题¶ 解释器因为某个分段错误.总线错误.访问越界或其他致命错误而突然间奔溃. 你想获得Python堆栈信息,从而找出在发生错误的时候你的程序运行点. 解决方案¶ faul ...

  9. 洛谷P4219 [BJOI2014]大融合(LCT,Splay)

    LCT维护子树信息的思路总结与其它问题详见我的LCT总结 思路分析 动态连边,LCT题目跑不了了.然而这题又有点奇特的地方. 我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘 ...

  10. MongoDB存储引擎(中)——WiredTiger

    上一篇博文介绍了MongoDB的MMAPv1存储引擎,本文接着介绍MongoDB另一个存储引擎--WiredTiger,WiredTiger是在MongoDB3.0版本引入的,并且在MongoDB3. ...