数据结构与算法分析-用C语言实现栈(数组方式)
用单链表实现栈并不是最好的方法,因为出入栈都要涉及指针的操作,在一些情况下这些操作可能会花费过长的时间,最简单实现栈的方法还是用数组的方式,用一个int型的数字表示栈顶元素的位置,进栈和出栈只需要对这个数字进行自加或自减就可以了。缺点是需要提前知道栈的大小,不支持动态增加栈的容量。
首先,老规矩,声明结构,类型,和常用例程。
/**
* @file Stack.h
* @brief 用数组实现栈-声明ADT部分
* @details
* @author jason.mrbourne@gmail.com
* @date 2014-5-20
*/
#include <stdio.h>
#ifndef _Stack_h//实现栈所需类型和结构
typedef int ElementType;
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); //入栈
void Pop(Stack S); //出栈
ElementType TopAndPop(Stack S); //出栈并返回栈顶元素
void FatalError(char *); //错误信息#endif // _Stack_h
接下来是实现部分。
/**
* @file Stack.c
* @brief 用数组实现栈-实现部分
* @details
* @author jason.mrbourne@gmail.com
* @date 2014-5-20
*/
#include <Stack.h>
#include <stdio.h>
#define EmptyTOS (-1) //空栈栈顶位置
#define MinStackSize (5) //最小栈大小//栈的结构
struct StackRecord
{int Capacity; //容量,即最大元素个数int TopOfStack; //栈顶位置ElementType *Array; //保存栈内元素的数组
};//错误信息
void FatalError(char* str)
{printf("%s", str);
}//创建一个栈
Stack CreateStack(int MaxElements)
{Stack S;//不能小于规定的最小大小if (MaxElements < MinStackSize)FatalError("Stack is too small.");//为栈申请空间S = malloc(sizeof(struct StackRecord));if (S==NULL)FatalError("Out of space.");//为栈内数组申请空间S->Array = malloc(sizeof(ElementType)*MaxElements);if (S->Array == NULL)FatalError("Out of Space");S->Capacity = MaxElements;MakeEmpty(S);return S;
}//消除栈
void DisposeStack(Stack S)
{if (S != NULL){free(S->Array); //先释放S->Array,若先释放S则无法引用S->Arrayfree(S);}
}//判断栈是否为空
int IsEmpty(Stack S)
{return S->TopOfStack == EmptyTOS;
}//判断栈是否已满
int IsFull(Stack S)
{return S->TopOfStack == S->Capacity;
}//置空栈
void MakeEmpty(Stack S)
{S->TopOfStack = EmptyTOS;
}//入栈
void Push(ElementType X, Stack S)
{if (IsFull(S))FatalError("Full Stack.");elseS->Array[++S->TopOfStack] = X;
}//出栈
void Pop(Stack S)
{if (IsEmpty(S))FatalError("Empty Stack");elseS->TopOfStack--;
}//出栈并返回栈顶元素
ElementType TopAndPop(Stack S)
{if (IsEmpty(S))FatalError("Empty Stack");elsereturn S->Array[S->TopOfStack--];return 0;
}
最后我们在main函数中测试。
/**
* @file main.c
* @brief 用数组实现栈-测试部分
* @details
* @author jason.mrbourne@gmail.com
* @date 2014-5-20
*/
#include <stdio.h>
#include <stdlib.h>
#include <Stack.h>int main()
{//向栈中放入3个元素并依次出栈Stack S = CreateStack(100);Push(1,S);Push(2,S);Push(3,S);while (!IsEmpty(S))printf("%d \t", TopAndPop(S));
}
一定要自己敲几遍才能掌握,多动手才可能真正弄懂,只看是不行的,学习编程没有捷径,必须要一个一个程序得编,一个一个算法得背。
转载于:https://www.cnblogs.com/mrbourne/p/9959460.html
数据结构与算法分析-用C语言实现栈(数组方式)相关推荐
- 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案...
转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...
- python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt
数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...
- 数据结构(八) -- C语言版 -- 栈和队列 - 队列的设计与实现
我让你知道我有啥 零.读前说明 一.队列的概述 二.队列的操作 三.队列的两种存储结构的模型概述 四.顺序存储结构的队列及实现 4.1.顺序存储结构的传统队列简易实现与测试 4.2.顺序存储结构的队列 ...
- 数据结构与算法(C语言) | 栈和队列——栈(自己做过测试)
栈是一种重要的线性结构,通常称,栈和队列是限定插入和删除只能在表的"端点"进行的线性表.(后进先出) –栈的元素必须"后进先出". –栈的操作只能在这个线性表的 ...
- 数据结构与算法分析1.2 Python采用栈的回溯解决四色问题
如图所示: 解决代码如下: import numpy as npclass Node:def __init__(self, data, next=None):self.data = dataself. ...
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Minimax策略...
2014.07.08 20:53 简介: Minimax策略描述的是二人在轮流操作的博弈中,尽力使自己的利益最大化(Max),使对手利益最小化(Min)的一种策略. 这样的游戏有很多种,其中最典型的就 ...
- 《数据结构与算法分析:C语言描述》复习——第六章“排序”——基数排序
2014.06.17 06:42 简介: 基数排序是一种非比较算法,通过多轮的分配与合并来排序整个数组.应用范围比较窄,根据Wikipedia的说法,它只适合整数排序. 描述: 基数排序和桶排序有点类 ...
- 《数据结构与算法分析:C语言描述》复习——第六章“排序”——插入排序
2014.06.17 01:37 简介: 插入排序是最常用的O(n^2)级别的交换排序算法.之所以最常用,是因为它和选择排序.冒泡排序相比,有着自己的优势. 描述: 如果数组的前i - 1个元素已经排 ...
- 【C语言】(数组方式)输出一组成绩中的最高分与最低分
两种不同方式获取最大值与最小值 代码1: #include <stdio.h> int main() {float score[5], sum = 0, max, min;int i;pr ...
最新文章
- c语言使用指定字符串替换特定的子串
- 中国水泥工业节能减排行业盈利前景与十四五专项规划报告2022年
- session 存放对象变量,及遇到的奇怪现象
- SAP UI5 application component运行时加载的奥秘
- 最易懂的Spring IOC原理讲解
- 15款免费IDE,推荐给开发者
- 量子计算机加密货币,量子计算机会打击到加密货币吗?
- [BZOJ]4650 优秀的拆分(Noi2016)
- codevs 1683 车厢重组
- 传智播客管家婆java答案_传智播客 Java基础入门习题谜底
- 春节假期,把“电影院”搬回家,泰捷WEBOX T1S 投影仪全面评测
- 彻底清除 mplay.com与mplay.exe病毒
- Java基础篇--集合(map)
- IDEA 打包没有main class (非maven)
- 30秒让你弄懂pdf怎么翻译,还在犹豫什么
- ffmpeg锐化算法
- 计算机和网络设备的辐射强,计算机网络设备信息辐射泄漏与抑制
- 5G毫米波Vs毫米波通信模块
- 数学建模学习——分类模型
- 全国程序员薪酬大曝光!看完我酸了····