顺序实现:

存储结构:

  1. #define STACK_INIT_SIZE 10 // 存储空间初始分配量
  2. #define STACK_INCREMENT 2 // 存储空间分配增量
  3. struct SqStack
  4. {
  5. SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
  6. SElemType *top; // 栈顶指针
  7. int stacksize; // 当前已分配的存储空间,以元素为单位
  8. }; // 顺序栈


基本操作:

  1. void InitStack(SqStack &S)
  2. { // 构造一个空栈S
  3. if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
  4. exit(OVERFLOW); // 存储分配失败
  5. S.top=S.base;
  6. S.stacksize=STACK_INIT_SIZE;
  7. }
  8.  
  9. void DestroyStack(SqStack &S)
  10. { // 销毁栈S,S不再存在
  11. free(S.base);
  12. S.base=NULL;
  13. S.top=NULL;
  14. S.stacksize=0;
  15. }
  16.  
  17. void ClearStack(SqStack &S)
  18. { // 把S置为空栈
  19. S.top=S.base;
  20. }
  21.  
  22. Status StackEmpty(SqStack S)
  23. { // 若栈S为空栈,则返回TRUE,否则返回FALSE
  24. if(S.top==S.base)
  25. return TRUE;
  26. else
  27. return FALSE;
  28. }
  29.  
  30. int StackLength(SqStack S)
  31. { // 返回S的元素个数,即栈的长度
  32. return S.top-S.base;
  33. }
  34.  
  35. Status GetTop(SqStack S,SElemType &e)
  36. { // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
  37. if(S.top>S.base)
  38. {
  39. e=*(S.top-1);
  40. return OK;
  41. }
  42. else
  43. return ERROR;
  44. }
  45.  
  46. void Push(SqStack &S,SElemType e)
  47. { // 插入元素e为新的栈顶元素
  48. if(S.top-S.base>=S.stacksize) // 栈满,追加存储空间
  49. {
  50. S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
  51. if(!S.base)
  52. exit(OVERFLOW); // 存储分配失败
  53. S.top=S.base+S.stacksize;
  54. S.stacksize+=STACK_INCREMENT;
  55. }
  56. *(S.top)++=e;
  57. }
  58.  
  59. Status Pop(SqStack &S,SElemType &e)
  60. { // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
  61. if(S.top==S.base)
  62. return ERROR;
  63. e=*--S.top;
  64. return OK;
  65. }
  66.  
  67. void StackTraverse(SqStack S,void(*visit)(SElemType))
  68. { // 从栈底到栈顶依次对栈中每个元素调用函数visit()
  69. while(S.top>S.base)
  70. visit(*S.base++);
  71. printf("\n");
  72. }

循环队列

存储结构

  1. #define MAX_QSIZE 5 // 最大队列长度+1
  2. struct SqQueue
  3. {
  4. QElemType *base; // 初始化的动态分配存储空间
  5. int front; // 头指针,若队列不空,指向队列头元素
  6. int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
  7. };

基本操作:

  

  1. void InitQueue(SqQueue &Q)
  2. { // 构造一个空队列Q
  3. Q.base=(QElemType *)malloc(MAX_QSIZE*sizeof(QElemType));
  4. if(!Q.base) // 存储分配失败
  5. exit(OVERFLOW);
  6. Q.front=Q.rear=0;
  7. }
  8.  
  9. void DestroyQueue(SqQueue &Q)
  10. { // 销毁队列Q,Q不再存在
  11. if(Q.base)
  12. free(Q.base);
  13. Q.base=NULL;
  14. Q.front=Q.rear=0;
  15. }
  16.  
  17. void ClearQueue(SqQueue &Q)
  18. { // 将Q清为空队列
  19. Q.front=Q.rear=0;
  20. }
  21.  
  22. Status QueueEmpty(SqQueue Q)
  23. { // 若队列Q为空队列,则返回TRUE;否则返回FALSE
  24. if(Q.front==Q.rear) // 队列空的标志
  25. return TRUE;
  26. else
  27. return FALSE;
  28. }
  29.  
  30. int QueueLength(SqQueue Q)
  31. { // 返回Q的元素个数,即队列的长度
  32. return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
  33. }
  34.  
  35. Status GetHead(SqQueue Q,QElemType &e)
  36. { // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
  37. if(Q.front==Q.rear) // 队列空
  38. return ERROR;
  39. e=Q.base[Q.front];
  40. return OK;
  41. }
  42.  
  43. Status EnQueue(SqQueue &Q,QElemType e)
  44. { // 插入元素e为Q的新的队尾元素
  45. if((Q.rear+1)%MAX_QSIZE==Q.front) // 队列满
  46. return ERROR;
  47. Q.base[Q.rear]=e;
  48. Q.rear=(Q.rear+1)%MAX_QSIZE;
  49. return OK;
  50. }
  51.  
  52. Status DeQueue(SqQueue &Q,QElemType &e)
  53. { // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
  54. if(Q.front==Q.rear) // 队列空
  55. return ERROR;
  56. e=Q.base[Q.front];
  57. Q.front=(Q.front+1)%MAX_QSIZE;
  58. return OK;
  59. }
  60.  
  61. void QueueTraverse(SqQueue Q,void(*vi)(QElemType))
  62. { // 从队头到队尾依次对队列Q中每个元素调用函数vi()
  63. int i;
  64. i=Q.front;
  65. while(i!=Q.rear)
  66. {
  67. vi(Q.base[i]);
  68. i=(i+1)%MAX_QSIZE;
  69. }
  70. printf("\n");
  71. }

数据结构读书笔记(三)(C语言)的更多相关文章

  1. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  2. 【转载】MDX Step by Step 读书笔记(三) - Understanding Tuples (理解元组)

    1. 在 Analysis Service 分析服务中,Cube (多维数据集) 是以一个多维数据空间来呈现的.在Cube 中,每一个纬度的属性层次结构都形成了一个轴.沿着这个轴,在属性层次结构上的每 ...

  3. ES6读书笔记(三)

    前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,<ES6读书笔记(二)>,现在为第三篇,本篇内容包括: 一.Promise 二.Iterator和for of循 ...

  4. 【记】《.net之美》之读书笔记(一) C#语言基础

    前言 工作之中,我们习惯了碰到任务就直接去实现其业务逻辑,但是C#真正的一些基础知识,在我们久而久之不去了解巩固的情况下,就会忽视掉.我深知自己正一步步走向只知用法却不知原理的深渊,所以工作之余,一直 ...

  5. 《你必须知道的.NET》读书笔记三:体验OO之美

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...

  6. Spring揭秘 读书笔记 三 bean的scope与FactoryBean

    本书可作为王富强所著<<Spring揭秘>>一书的读书笔记  第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...

  7. Struts2技术内幕 读书笔记三 表示层的困惑

    表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form ...

  8. Mastering Web Application Development with AngularJS 读书笔记(三)

    第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...

  9. R语言实战读书笔记(三)图形初阶

    这篇简直是白写了,写到后面发现ggplot明显更好用 3.1 使用图形 attach(mtcars)plot(wt, mpg) #x轴wt,y轴pgabline(lm(mpg ~ wt)) #画线拟合 ...

随机推荐

  1. Android 开发笔记 “SQLite”

    SQLite 入门与分析 1.SQLite介绍 自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分.正与数据库管理系统非常关键一样,它们也变得非常庞大,并占用了相当多的系统资源, ...

  2. C语言之ASCII码

    ASCII码 ASCII码值在65~90之间,为大写字母.ASCII码值在97~122之间,为小写字母.ASCII码值在48~57之间,为数字.ASCII码值不在上述3个范围内,为特殊字符.

  3. Chrome Firefox 自定义背景色

    Chrome有个自定义背景色的文件  Custom.css 默认里面什么字都没写 html, body {background-color: #e0dcc0!important;}      这个颜色 ...

  4. 转:按需加载html 图片 css js

    按需加载是前端性能优化中的一项重要措施,按需加载是如何定义的呢?顾名思义,指的是当用户触发了动作时才加载对应的功能.触发的动作,是要看具体的业务场景而言,包括但不限于以下几个情况:鼠标点击.输入文字. ...

  5. Maxicode码

    Maxicode的缘起和发展 1980年代晚期,美国知名的UPS(United Parcel Service)快递公司认知到利用机器辨读资讯可有效改善作业效率.提高服务品质,故从1987年开始着手於机 ...

  6. Qt技巧:Win7下打包发布Qt程序(解释的比较清楚,把exe和dll伪装合并成一个文件)

    转自:http://www.stardrad.com/blog/qt-5%E7%A8%8B%E5%BA%8F%E5%9C%A8windows%E4%B8%8A%E7%9A%84%E5%8F%91%E5 ...

  7. [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET

    Women Techmaker 北京站 [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET     [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素    发表于2 ...

  8. ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3

    ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3

  9. CSS实现背景图尺寸不随浏览器大小而变化的两种方法

    一些网站的首页背景图尺寸不随浏览器缩放而变化,本例使用CSS 实现背景图尺寸不随浏览器缩放而变化,方法一. 把图片作为background,方法二使用img标签.喜欢的朋友可以看看   一些网站的首页 ...

  10. Codeforces 41D Pawn 简单dp

    题目链接:点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵,每一个位置由 0-9的一个整数表示 问: 从最后一行開始向上走到第一行使得路径上的和 % (k+1) == 0 每一个格子仅仅 ...