堆栈的实现(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)每个对象都有自己的由其他对象所构成的存储 ...
随机推荐
- aptana studio 3 自动换行(无需插件)
菜单-Window-Preferences-Aptana Studio-Editors,勾选“Enable word wrap”,然后重启编辑器.
- POJ 3311 Hie with the Pie(Floyd+状态压缩DP)
题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...
- db2常用名词
数据库---表空间----表-----段-------分区 数据库实例:就是server 数据库模式:就是逻辑上的用户
- js鼠标事件、键盘事件实例代码
讲述了:鼠标的哪个按键被点击.当前鼠标的光标坐标是多少.被按下键的unicode码是多少.当前鼠标的光标相对于屏幕的坐标是多少.当前鼠标的光标坐标是多少.shift键是否按下.当前被点击的是哪一个元素 ...
- Coding.net 代码管理快速入门
当项目创建好了之后,我们该如何上传代码到 coding 上呢? Coding 网站使用“ Git 仓库”(类似 github )来管理代码. 其操作原理在于:利用 git 服务,将本地的项目目录下的文 ...
- AI
- Python进阶07 函数对象
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象 ...
- Android牟利之道(一)--界面嵌入有米广告
经过了一番折腾,忙忙碌碌了一下午,终于搞明白了Android软件界面嵌入广告的方法,以下我以嵌入有米广告为例小结一下: 我的新浪微博(wind瑞):http://weibo.com/tianrui19 ...
- oracle游标循环的嵌套
完成批量修改user_tables中的所有表的栏位名(从MS SQL导入过来,发现大小写问题,造成很多麻烦) 存储过程见下: -- Created on 2012/3/14 by FREE decla ...
- Tomcat下部署多个项目
转载地址:http://blog.csdn.net/philosophyatmath/article/details/30246631 同一端口号的多个项目部署 添加: <Context ...