C语言描述栈的实现及操作(链表实现)
#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语言描述栈的实现及操作(链表实现)的更多相关文章
- C语言描述栈的实现及操作(数组实现)
一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- C语言描述二叉树的实现及操作(链表实现)
概述 二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...
- C语言描述队列的实现及操作(链表实现)
// 队列的单链表实现 // 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方 // 首节点:头节点后第一个节点,存放数据 #include<stdio.h> #incl ...
- C语言描述队列的实现及操作(数组实现)
一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...
- 【数据结构】之栈(C语言描述)
栈(Stack)是编程中最常用的数据结构之一. 栈的特点是“后进先出”,就像堆积木一样,堆的时候要一块一块堆到最上面,拆的时候需要从最上面一块一块往下拆.栈的原理也一样,只不过它的操作不叫堆和拆,而是 ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 【数据结构】之栈(Java语言描述)
在前面的[这篇文章]中,我简单介绍了栈这种数据结构的操作功能,并使用C语言对其进行了代码的编写. Java的JDK中默认为我们提供了栈这种数据结构的API—— Stack . Java中的Stack类 ...
随机推荐
- 航空客户价值分析特色LRFMC模型——RFM升级
本文转载自微信公众号TIpDM. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 我们说RFM ...
- SOCKET 编程TCP/IP、UDP
TCP/IP 资源:http://download.csdn.net/detail/mao0514/9061265 server: #include<stdio.h> #include&l ...
- Java获取当前的年月
今天,我在尝试从数据库取数据的过程中,发现页面初始化时需要给时间控件赋初值.于是,我就写了一个获取当前年月的时间工具类. 1.具体源码如下: YearAndMonth.java: /** * @Tit ...
- Caused by: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 81;
1.错误描述 严重: Exception sending context initialized event to listener instance of class org.springframe ...
- 芝麻HTTP: Python爬虫入门之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- CF370 D Memory and Scores
dp题 并运用了前缀和 我看题目提示中有fft 我想了下感觉复杂度不过关还是未解 #include<bits/stdc++.h> using namespace std; typedef ...
- C# wav语音文件合并
开发完成语音播报产品,由于客户所使用的播放产品种类繁多,在使用HDMI接口播放音频时,由于采用的声卡不同,个别机器会出现播报声音过小,或者不播报的情况.所以采用将语音文件合并播放的方式,来解决此问题. ...
- Python Cookbook(第3版)中文版:15.19 从C语言中读取类文件对象
15.19 从C语言中读取类文件对象¶ 问题¶ 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案¶ 要读取一个类文件对象的数据,你需要重复调 ...
- 举例MyBatis的常用的API及方法
在使用MyBatis框架是,主要涉及以下几个API: 1.SqlSessionFactoryBuilder该对象根据MyBatis配置文件SqlMapConfig.xml构建SQLSessionFac ...
- 【CJOJ P1365】最短路
http://oj.changjun.com.cn/problem/detail/pid/1365 Description 给出N个点,M条无向边的简单图,问所有点对之间的最短路. Input 第1行 ...