堆栈的实现(c语言)
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define EmptyTOS (-1) //数组堆栈需要 #define MinStackSize (5) //数组堆栈需要 //堆栈函数的声明 struct Node; typedef struct Node *PtrToNode; typedef PtrToNode Stack; typedef int ElementType; bool IsEmpty(Stack S); //检测堆栈是否为空 Stack CreateStack(); //创建堆栈 void DisposeStack(Stack); //毁灭堆栈 void Push(ElementType X, Stack S); //元素进栈 ElementType Pop(Stack S); //元素出栈 void MakeEmpty(Stack S); //清空堆栈中的元素 //ElementType Pop(Stack S); //元素出栈 (数组实现) bool IsFull(Stack S); //检测堆栈是否已满 (数组实现需要) void printStack(Stack S); //输出堆栈中的元素 struct Node { //链表结构 ElementType Element; PtrToNode Next; }; //struct Node { //数组结构 // int Capacity; //容量 // int TopOfStack: //栈顶 // ElementType *Array; //}; int main() { int number, flag; ElementType X; Stack S; flag = ; printf("| 堆栈的基本使用 |\n"); printf("|************************************|\n"); printf("| 1. 创建堆栈 |\n"); printf("| 2. 销毁堆栈 |\n"); printf("| 3. 入栈 |\n"); printf("| 4. 出栈 |\n"); printf("| 5. 打印堆栈元素 |\n"); printf("|************************************|\n"); while (flag) { printf("请选择功能 : \n"); scanf("%d", &number); switch(number) { : S = CreateStack(); break; : if (S) { DisposeStack(S); } else printf("堆栈不存在!!!\n"); break; : if (S) { printf("请输入需要插入的元素:"); scanf("%d", &X); Push(X, S); } else printf("堆栈不存在!!!\n"); break; : if (S) { Pop(S); } else printf("堆栈不存在!!!\n"); break; : if (S) { printf("堆栈中元素如下:"); printStack(S); } else printf("堆栈不存在!!!\n"); break; default : printf("程序运行结束,请按任意键退出!!!\n"); flag = ; } } ; } //函数定义 bool IsEmpty(Stack S) //检测堆栈是否为空 (链表) { return S->Next == NULL; } //bool IsEmpty(Stack S) //检测堆栈是否为空 (数组) //{ // return S->TopOfStack == EmptyTOS; //} Stack CreateStack() //创建堆栈 (链表) { Stack S; if (!(S = malloc(sizeof(struct Node)))) exit(-); S->Next = NULL; return S; } // Stack CreateStack(int MaxElements) //创建堆栈 (数组) //{ // Stack S; // // if (MaxElements < MinStackSize) { // printf("堆栈空间太小了!!"); // return -1; // } // // if (!(S = malloc(sizeof(struct Node)))) // exit(-1); // if (!(S->Array = malloc(sizeof((ElementType) * MaxStackSize)))) // exit(-1); // S->Capacity = MaxStackSize; // // return S; // } void DisposeStack(Stack S) //毁灭堆栈 (链表) { PtrToNode P, TmpCell; P = S->Next; S->Next = NULL; while (P) { TmpCell = P->Next; free(P); P = TmpCell; } free(S); } // void DisposeStack(Stack S) //毁灭堆栈 (数组) // { // if (S != NULL) { // free(S->Array); // free(S); // } // } void Push(ElementType X, Stack S) //元素进栈 (链表) { PtrToNode TmpCell; if (!(TmpCell = malloc(sizeof(struct Node)))) exit(-); else { TmpCell->Element = X; TmpCell->Next = NULL; } TmpCell->Next = S->Next; S->Next = TmpCell; } //void Push(ElementType X, Stack S) //元素进栈 (数组) //{ // if (!IsFull(S)) // S->Array[++TopOfStack] = X; // else // printf("堆栈已满!!\n"); //} ElementType Pop(Stack S) //元素出栈 (链表) { Stack TmpCell; ElementType X; if (IsEmpty(S)) { printf("堆栈为空!!!\n"); ; } else { TmpCell = S->Next; S->Next = TmpCell->Next; X = TmpCell->Element; free(TmpCell); return X; } } //ElementType Pop(Stack S) //元素出栈 (数组) //{ // if (!IsEmpty(S)) // return S->Array[TopOfStack--]; // else // printf("堆栈为空,出栈异常!!!\n"); //} void MakeEmpty(Stack S) //清空堆栈中的元素 (链表) { PtrToNode P, TmpCell; P = S->Next; S->Next = NULL; while (P) { TmpCell = P->Next; free(P); P = TmpCell; } } //void MakeEmpty(Stack S) //清空堆栈中的元素 (数组) //{ // S->TopOfStack == EmptyTOS; //} //bool IsFull(Stack S) //检测堆栈是否已满 (数组实现需要) //{ // return S->(++TopOfStack) == S->Capacity; //} // void printStack(Stack S) //打印堆栈中元素 { ElementType P; while (!IsEmpty(S)) { P = Pop(S); printf("%d ", P); } printf("\n"); }
堆栈的实现(c语言)的更多相关文章
- GDB调试汇编堆栈
GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...
- 左求值表达式,堆栈,调试陷阱与ORM查询语言的设计
1,表达式的求值顺序与堆栈结构 “表达式” 是程序语言一个很重要的术语,也是大家天天写的程序中很常见的东西,但是表达式的求值顺序一定是从左到右么? C/C++语言中没有明确规定表达式的运算顺序(从左到 ...
- 利用反汇编手段解析C语言函数
1.问题的提出函数是 C语言中的重要概念.利用好函数能够充分利用系统库的功能写出模块独立.易于维护和修改的程序.函数并不是 C 语言独有的概念,其他语言中的方法.过程等本质上都是函数.可见函数在教学中 ...
- 物联网的语言c,python,go等
日本生鱼片 电热水器的使用方法http://www.hiry.cn/b/mt/33959.html 物联网层次很多,首先要看你从事哪个层级的工作了.既然你问语言,那么肯定是开发类的工作,开发类的对象中 ...
- cgo 和 Go 语言是两码事
cgo不是Go 借用 JWZ的一句话 有些人,当他们面临一个问题时,认为“我知道,我会使用 cgo ”.那么现在,他们有了两个问题. 最近有人在 Gopher 的 Slack Channel 上使用 ...
- [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类
目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...
- [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库
前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...
- (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出
(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安 ...
- Java编程思想学习(一) 一切都是对象
前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的 ...
- Java入门到精通——基础篇之面向对象
一.概述. Java属于面向对象的一种语言,因为Java是面向对象的语言所以这个语言的诞生需要有五个基本特性: 1)万物皆为对象. 2)程序是对象的集合. 3)每个对象都有自己的由其他对象所构成的存储 ...
随机推荐
- API爬虫--Twitter实战
本篇将从实际例子出发,展示如何使用api爬取twitter的数据. 1. 创建APP 进入https://apps.twitter.com/,创建自己的app.只有有了app才可以访问twitter的 ...
- XHTML的使用规范
一.XHTML的简介 XHTML指的是可扩展超文本标记语言 XHTML与HTML4.01几乎是相同的 XHTML是更严格更纯净的HTML版本 XHTML是以XML应用的方式定义的HTML 二.为什么使 ...
- A+B问题 涉及EOF
输入将包括一系列对的整数a和b,通过一空间,一对每行整数分离的. 产量 对于每对输入的整数a和b你应该输出的a和b的总和在一行,并用输出的一个行中输入每一行. 样本输入 1 5 2 3 样本输 ...
- JAVA 构造代码块
class G{ G(){ System.out.println("我是无参构造方法"); } G(String name){ System.out.println("我 ...
- 启动mongoDB 以及常用操作命令
nonsql 关系数据库 集合 表 文档 行 启动mongoDB之前首先手动创建存放MongoDB数据文件的目录,如e:\mongo_data 执行命令 mongod --dbpath=e: ...
- 树莓派安装3.5inch RPi LCD (A)显示屏
3.5inch RPi LCD (A) 资料 产品介绍 用户手册 开发资料 开发软件 树莓派镜像 演示视频 FAQ 在自定义Raspbian系统镜像上怎么使用树莓派LCD? 先确保自定义镜像可正常进入 ...
- 配置jetty 远程调试
该调试不支持hessian 接口调用 1.配置远程jetty 服务器的 bin/jetty.sh JAVA_OPTIONS+=("-Xdebug -Xrunjdwp:server=y,tra ...
- js上移、下移、置顶、置底功能实现
实现页面上列表内容上移.下移.置顶.置底 功能,主要实现思路是节点操作,比如说:上移,直接把点击项移动到前一个节点,以此类推,当然实际代码实现还要加些判断,如当前点击操作项是否已经是置底或置底了,如果 ...
- Java Volatile相关文章目录
参考资料: http://www.google.com/cse?sa.x=0&sa.y=0&cx=010284515138798138769%3Aajbqkpwaapm&ie= ...
- 玄机论坛Socket类库源码 当前版本 2.6.3 更新日期:10-09/2015 z
http://bbs.msdn5.com/thread-27-1-1.html 本类库采用TcpLister,TcpClient高度封装, 采用NetworkStream进行异步模式读取数据. 采用S ...