#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. Android okHttp网络请求库详解

    okhttp 是一个 Java 的 HTTP+SPDY 客户端开发包,同时也支持 Android.需要Android 2.3以上. 特点 OKHttp是Android版Http客户端.非常高效,支持S ...

  2. Java中的i++和i--

    /** * @Title:DataCate.java * @Package:com.you.dao * @Description:数据类型转换 * @Author: 游海东 * @date: 2014 ...

  3. (二十八)monggodb和maven零散笔记

    (1)maven导包的问题:当在pom.xml界面的Dependencies中点击add之后输入jar包查询条件后,如果确定条件没有输错,repo中也确实存在相关jar包,而并没有查处任何结果时,可以 ...

  4. 芝麻HTTP: Python爬虫利器之Requests库的用法

    前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...

  5. 异常-----java.sql.SQLException:ORA-01861:文字和格式字符串不匹配

    1.错误描述 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配 2.错误原因 字段名为statis_date在数据库中存储的数据类型是Date,而在Java中拼接 ...

  6. css图片的相关操作

    css图片的相关操作 1.案例源码 <!DOCTYPE html><html lang="en"><head> <meta charset ...

  7. 如何通过java反射的方式对java私有方法进行单元测试

    待测试的私有方法: import org.testng.Assert;import org.testng.annotations.BeforeClass;import org.testng.annot ...

  8. GridView添加事件监听和常用属性解析

    1. 使用流程 graph LR 准备数据源-->新建适配器 新建适配器-->绑定数据源 绑定数据源-->加载适配器 2. 常用属性 android:columnWidth:每一列的 ...

  9. 1.17学习jquery权威指南

    1.ajax方面(东西比较杂,很多相关于.net挂钩的服务器端接触没有实际操作,全部放进来,或许以后当作demo使用) ¥(“body”).load("text.txt");   ...

  10. 【BZOJ2154】Crash的数字表格(莫比乌斯反演)

    [BZOJ2154]Crash的数字表格(莫比乌斯反演) 题面 BZOJ 简化题意: 给定\(n,m\) 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 以下的一切都 ...