《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)
这次的数据结构是一种特殊的线性表:栈(Stack)
栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素。
栈在程序中的地位非常重要,其中最重要的应用就是函数的调用。每次函数调用时都会创建该函数的一个“活动记录”( Activation Record ,或称作“帧”( Frame ))压入运行时堆栈中,用于保存函数的参数,返回值,返回指令地址,返回活动记录地址,局部变量等内容。当然,在高级语言中我们不需要手动完成这一工作,学习汇编语言时会体会到其真正过程。
下面给出笔者对于堆栈的两种实现。首先是顺序(数组)存储实现:
// Stack.h #include <stdio.h>
#include <stdlib.h> struct StackRecord;
typedef struct StackRecord *Stack; int IsEmpty(Stack S);
int IsFull(Stack S);
Stack CreateStack(int MaxElements);
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X, Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
ElementType TopAndPop(Stack S);
// Stack.c
#include "Stack.h"
struct StackRecord{
int Capacity;
int TopOfStack;
ElementType *Array;
};
int IsEmpty(Stack S)
{
return S->TopOfStack == -1;
}
int IsFull(Stack S)
{
return S->TopOfStack == S->Capacity - 1;
}
Stack CreateStack(int MaxElements)
{
Stack ret;
if((ret = (Stack)malloc(sizeof(struct StackRecord))) != NULL)
{
ret->TopOfStack = -1;
ret->Capacity = MaxElements;
if((ret->Array = (ElementType*)malloc(MaxElements * sizeof(ElementType))) != NULL)
return ret;
free(ret);
}
printf("Error! Out of memory! \n");
return NULL;
}
void DisposeStack(Stack S)
{
if(S)
{
free(S->Array);
free(S);
}
}
void MakeEmpty(Stack S)
{
S->TopOfStack = -1;
}
void Push(ElementType X, Stack S)
{
if(IsFull(S))
{
printf("Error! The stack is full! \n");
return;
}
(S->Array)[++(S->TopOfStack)] = X;
}
ElementType Top(Stack S)
{
if(IsEmpty(S))
{
printf("Error! The stack is empty! \n");
return 0;
}
return (S->Array)[(S->TopOfStack)];
}
void Pop(Stack S)
{
if(IsEmpty(S))
{
printf("Error! The stack is empty! \n");
return;
}
S->TopOfStack -= 1;
}
ElementType TopAndPop(Stack S)
{
if(IsEmpty(S))
{
printf("Error! The stack is empty! \n");
return 0;
}
return (S->Array)[(S->TopOfStack)--];
}
接下来是链式存储实现:
// Stack.h #include <stdio.h>
#include <stdlib.h> struct _Node;
typedef struct _Node Node;
typedef Node *PtrToNode;
typedef PtrToNode Stack; int IsEmpty(Stack S);
Stack CreateStack();
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X, Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
// Stack.c #include "Stack.h" struct _Node
{
ElementType Element;
struct _Node *Next;
}; void print(Stack S)
{
for (PtrToNode p = S->Next; p; p = p->Next)
{
printf("%d ", p->Element);
}
printf("\n");
} int main()
{
Stack s = CreateStack();
print(s);
Pop(s);
printf("%d", Top(s));
Push(2, s);
Push(3, s);
Push(5, s);
print(s);
Pop(s);
print(s);
MakeEmpty(s);
print(s);
DisposeStack(s);
getchar();
getchar();
} int IsEmpty(Stack S)
{
return S->Next == NULL;
} Stack CreateStack()
{
Stack ret;
if ((ret = (Stack)malloc(sizeof(Node))) != NULL)
{
ret->Next = NULL;
return ret;
}
printf("Error! Out of memory! \n");
return 0;
} void DisposeStack(Stack S)
{
PtrToNode p = S;
while (S != NULL)
{
S = S->Next;
free(p);
p = S;
}
} void MakeEmpty(Stack S)
{
if (S == NULL)
{
printf("Error! It's not a Stack!\n");
return;
}
while (!IsEmpty(S))
Pop(S);
} void Push(ElementType X, Stack S)
{
PtrToNode t;
if ((t = (PtrToNode)malloc(sizeof(Node))) != NULL)
{
t->Element = X;
t->Next = S->Next;
S->Next = t;
return;
}
printf("Error! Out of memory! \n");
} ElementType Top(Stack S)
{
if (S->Next == NULL)
{
printf("Error! The stack is empty! \n");
return 0;
}
return S->Next->Element;
} void Pop(Stack S)
{
PtrToNode p = S->Next;
if (p == NULL)
{
printf("Error! The stack is empty! \n");
return;
}
S->Next = p->Next;
free(p);
}
以上就是堆栈的两种实现。由于较为简单,不再给出测试样例。
《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)的更多相关文章
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
- C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
- 《数据结构与算法分析-Java语言描述》 分享下载
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...
- 读书笔记:《数据结构与算法分析Java语言描述》
目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)
二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.05) : 散列(Hash)
散列(Hash)是一种以常数复杂度实现查找功能的数据结构.它将一个关键词Key,通过某种映射(哈希函数)转化成索引值直接定位到相应位置. 实现散列有两个关键,一是哈希函数的选择,二是冲突的处理. 对于 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.04) : AVL树(AVL-Tree)
上次我们已经实现了普通的二叉查找树.利用二叉查找树,可以用O(logN)高度的树状结构存储和查找数据,提高了存储和查找的效率. 然而,考虑一种极端情形:依次插入1,2,3,4,5,6,7,8,9九个元 ...
随机推荐
- UVA 12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
题目链接:https://vjudge.net/problem/UVA-12412 题目大意 略. 分析 比较大规模的模拟,注意输入输出,浮点数精度,还有排名相同的输出顺序,还有一些边界情况处理. 代 ...
- SGLTE/SVLTE、CSFB、SRVCC概念
SGLTE:Simultaneous GSM and LTE,手机可以同时驻留在GSM和LTE网络中,打电话通过GSM网络进行,数据业务通过LTE网络进行. SVLTE:Simultaneous V ...
- Java并发编程中的若干核心技术,向高手进阶!
来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...
- 解析Asp.net Core中使用Session的方法
2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Core中引 ...
- 类欧几里德算法(洛谷 P5170
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> ...
- Tomcat小技巧
目录 1.项目路径忽略项目名 2.配置tomcat虚拟目录 3.显示目录文件列表 4.设置URL不区分大小写 1.项目路径忽略项目名 server.xml中修改Context标签中的path属性为/ ...
- odoo js
1.相关库/框架 主要:jQuery(使用1.8.3,如果使用新版本,其他jQuery插件也要升级或修改).Underscore.QWeb 其他:都在addons\web\static\lib路径下. ...
- 廖雪峰Java13网络编程-2Email编程-1发送email
1.邮件发送 1.1传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 1.2电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件 ...
- JWT生成token
1.JWT简介 JSON Web Token 简称JWT.一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签名.JWT生成的token是这样的 2.Json Web Token(JWT)生 ...
- localStorage,sessionStorage,cookie区别
localStorage:HTML5新增的在浏览器端存储数据的方法.设置和获取localStorage的方法: 设置: localStorage.name = 'zjj'; 获取: localStor ...