#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. 【mysql】mysql内置函数

    mysql常用内置函数 1.mysql字符串函数 contact 字符串连接函数 mysql>select contact("he",'llo');# hello lcase ...

  2. Java中的“&”和“&&”的区别

    Java中的"&"和"&&"的区别 1."&"是位运算符,"&&"是逻辑 ...

  3. (十七)java冒泡排序和compareto

    java中的排序有:冒泡排序.快速排序.选择排序.插入排序和希尔排序,还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等.     冒泡排序法:利用双重for循环,重复走访要排序的数列,两两比较大 ...

  4. TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array. at mx.charts.series::LineSeries/ ...

  5. 第二个scala程序

    计算昨日收益,读取hdfs文件,使用临时表sqlcontext进行计算,结果保存于mysql中. 之前考虑过将结果存储于Hbase中,由于各种原因及问题,在加上数据量真的很小很小,就改成mysql了. ...

  6. type="submit" button的用法

    原因:关于页面刷新,或者点击某个按钮,开始能现实值,但几秒钟就会刷新掉的原因,这是因为sunmit 和button自带刷新属性,所以说少用就好,或者用returen fales 来断掉接下来的操作,当 ...

  7. MyEclipse开发平台下如何将新建的JSP页面的默认编码格式设置为UTF-8--JSP

    新建的JSP页面原始的编码格式是ISO-8859-1(测试的MyEclipse版本为2014),它是不支持中文,在预览JSP页面时会出现乱码的现象.当然自己手动改一下编码格式就好了,但是那太过麻烦,每 ...

  8. 多米诺骨牌放置问题(状压DP)

    例题: 最近小A遇到了一个很有趣的问题: 现在有一个\(n\times m\)规格的桌面,我们希望用\(1 \times 2\)规格的多米诺骨牌将其覆盖. 例如,对于一个\(10 \times 11\ ...

  9. [BZOJ1096] [ZJOI2007] 仓库建设 (斜率优化)

    Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天, ...

  10. webpack中hash与chunkhash区别和需要注意的问题

    项目发布时,为了解决缓存,需要进行md5签名,这时候就需要用到 hash 和 chunkhash等. 问题一:hash问题 使用 hash 对js和css进行签名时,每一次hash值都不一样,导致无法 ...