用单链表实现栈并不是最好的方法,因为出入栈都要涉及指针的操作,在一些情况下这些操作可能会花费过长的时间,最简单实现栈的方法还是用数组的方式,用一个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语言实现栈(数组方式)相关推荐

  1. 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案...

    转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...

  2. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt

    数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...

  3. 数据结构(八) -- C语言版 -- 栈和队列 - 队列的设计与实现

    我让你知道我有啥 零.读前说明 一.队列的概述 二.队列的操作 三.队列的两种存储结构的模型概述 四.顺序存储结构的队列及实现 4.1.顺序存储结构的传统队列简易实现与测试 4.2.顺序存储结构的队列 ...

  4. 数据结构与算法(C语言) | 栈和队列——栈(自己做过测试)

    栈是一种重要的线性结构,通常称,栈和队列是限定插入和删除只能在表的"端点"进行的线性表.(后进先出) –栈的元素必须"后进先出". –栈的操作只能在这个线性表的 ...

  5. 数据结构与算法分析1.2 Python采用栈的回溯解决四色问题

    如图所示: 解决代码如下: import numpy as npclass Node:def __init__(self, data, next=None):self.data = dataself. ...

  6. 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Minimax策略...

    2014.07.08 20:53 简介: Minimax策略描述的是二人在轮流操作的博弈中,尽力使自己的利益最大化(Max),使对手利益最小化(Min)的一种策略. 这样的游戏有很多种,其中最典型的就 ...

  7. 《数据结构与算法分析:C语言描述》复习——第六章“排序”——基数排序

    2014.06.17 06:42 简介: 基数排序是一种非比较算法,通过多轮的分配与合并来排序整个数组.应用范围比较窄,根据Wikipedia的说法,它只适合整数排序. 描述: 基数排序和桶排序有点类 ...

  8. 《数据结构与算法分析:C语言描述》复习——第六章“排序”——插入排序

    2014.06.17 01:37 简介: 插入排序是最常用的O(n^2)级别的交换排序算法.之所以最常用,是因为它和选择排序.冒泡排序相比,有着自己的优势. 描述: 如果数组的前i - 1个元素已经排 ...

  9. 【C语言】(数组方式)输出一组成绩中的最高分与最低分

    两种不同方式获取最大值与最小值 代码1: #include <stdio.h> int main() {float score[5], sum = 0, max, min;int i;pr ...

最新文章

  1. c语言使用指定字符串替换特定的子串
  2. 中国水泥工业节能减排行业盈利前景与十四五专项规划报告2022年
  3. session 存放对象变量,及遇到的奇怪现象
  4. SAP UI5 application component运行时加载的奥秘
  5. 最易懂的Spring IOC原理讲解
  6. 15款免费IDE,推荐给开发者
  7. 量子计算机加密货币,量子计算机会打击到加密货币吗?
  8. [BZOJ]4650 优秀的拆分(Noi2016)
  9. codevs 1683 车厢重组
  10. 传智播客管家婆java答案_传智播客 Java基础入门习题谜底
  11. 春节假期,把“电影院”搬回家,泰捷WEBOX T1S 投影仪全面评测
  12. 彻底清除 mplay.com与mplay.exe病毒
  13. Java基础篇--集合(map)
  14. IDEA 打包没有main class (非maven)
  15. 30秒让你弄懂pdf怎么翻译,还在犹豫什么
  16. ffmpeg锐化算法
  17. 计算机和网络设备的辐射强,计算机网络设备信息辐射泄漏与抑制
  18. 5G毫米波Vs毫米波通信模块
  19. 数学建模学习——分类模型
  20. 全国程序员薪酬大曝光!看完我酸了····

热门文章

  1. 使用Bochs调试Linux kernel 随笔 -- 准备
  2. MyEclipse6.5设置
  3. 虚拟机VMware Workstation与主机间共享文件(利用虚拟光驱)
  4. STL(1)——查找函数find的使用
  5. python将文字转换为语音_python实现将文本转换成语音
  6. CCF CSP202012-2期末预测之最佳阈值
  7. 炒股一年,本金18万已亏损10万,还要不要继续?
  8. 你是农村人吗,小时候放过牛吗,都有哪些好玩的趣事?
  9. 洞仙歌·冰肌玉骨 [宋] 苏轼
  10. 全职宝妈做自媒体怎么样