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类 ...
随机推荐
- Python Numpy包安装
1,下载python 下载地址: https://www.python.org/downloads/windows/ 2,配置python环境变量 在电脑的系统属性的系统变量path中添加python ...
- Flex中利用单选按钮切换柱状图横纵坐标以及描述
1.问题描述 一组单选按钮,有周和月之分,选择"周",柱状图横坐标显示的是周,纵坐标显示的是人数:选择"月",柱状图横坐标显示的月,纵坐标显示的是比率. 2.演 ...
- python 实现多层目录文件查找
本文针对多层目录下文件的查找. 利用 os模块的基本操作,并利用递归的思想实现了目录多层查找. 代码如下: import os #dir_name: 处理文件的起始目录 def count_file( ...
- POI生成word文档完整案例及讲解
一,网上的API讲解 其实POI的生成Word文档的规则就是先把获取到的数据转成xml格式的数据,然后通过xpath解析表单式的应用取值,判断等等,然后在把取到的值放到word文档中,最后在输出来. ...
- 纯CSS实现二级导航下拉菜单--css的简单应用
思想:使用css的display属性控制二级下拉菜单的显示与否.当鼠标移动到一级导航菜单的li标签时,显示二级导航菜单的ul标签.由于实现起来比较简单,所以在这里直接给出了参考代码. 1.纯CSS二级 ...
- SpringBoot特性
一.SpringBoot解决的问题 1.使编码变得简单 2.使配置变得简单 3.使部署变得简单 4.使监控变得简单 二.springboot主要特性 1.遵循习惯优于配置的原则.使用springboo ...
- thinkphp在mac下报错
简要:众所周知,开发软件最好的环境是在MAC下;为此在黑苹果上,用Thinkphp开发;在过程中出现,找不到model以及数据库类型错误;为此向大家分享解决办法,希望能够帮助困惑的伙伴们,如果有不对或 ...
- 【BZOJ3944】Sum(杜教筛)
[BZOJ3944]Sum(杜教筛) 题面 求\[\sum_{i=1}^n\mu(i)和\sum_{i=1}^n\phi(i)\] 范围:\(n<2^{31}\) 令\[S(n)=\sum_{i ...
- 踩坑系列の Oracle dbms_job简单使用
二话不说先上代码 --创建存储过程 create or replace procedure job_truncateState is begin --此处就是要定时执行的sql execute imm ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...