堆栈这种数据最鲜明的特点是:后进先出。

用动态数组实现堆栈:

  1. #include "C17.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>
  5. #include <assert.h>
  6.  
  7. static STACK_TYPE *stack;
  8. //static size_t stack_size
  9. static int stack_size;
  10. static int top_element = -;
  11.  
  12. void create_stack(int size)
  13. {
  14. assert(stack_size == );
  15. stack_size = size;
  16. stack = (STACK_TYPE *)malloc(stack_size * sizeof(STACK_TYPE));
  17. assert(stack != NULL);
  18. }
  19.  
  20. void destroy_stack(void)
  21. {
  22. assert(stack_size > );
  23. stack_size = ;
  24. free (stack);
  25. stack = NULL;
  26. }
  27.  
  28. void push (STACK_TYPE value)
  29. {
  30. assert(! is_full());
  31. top_element += ;
  32. stack[top_element] = value;
  33. }
  34.  
  35. void pop(void)
  36. {
  37. assert(!is_empty());
  38. top_element -= ;
  39. }
  40.  
  41. STACK_TYPE top(void)
  42. {
  43. assert(!is_empty());
  44. return stack[top_element];
  45. }
  46.  
  47. int is_empty(void)
  48. {
  49. assert(stack_size > );
  50. return top_element == -;
  51. }
  52.  
  53. int is_full(void)
  54. {
  55. assert(stack_size > );
  56. return top_element == stack_size -;
  57. }
  58.  
  59. int main(void)
  60. {
  61. int ret,i;
  62. create_stack();
  63. for(i= ;i<;i++)
  64. {
  65. push(i);
  66. }
  67.  
  68. for(i= ;i<;i++)
  69. {
  70. ret = top();
  71. printf("dynamic data: %d\n",ret);
  72. pop();
  73. }
  74. }

链式堆栈:

  1. #include "C17.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>
  5. #include <assert.h>
  6.  
  7. #define FALSE 0
  8.  
  9. typedef struct STACK_NODE
  10. {
  11. STACK_TYPE value;
  12. struct STACK_NODE *next;
  13. }StackNode;
  14.  
  15. static StackNode *stack;
  16. //static int stack_size;
  17. //static int top_element = -1;
  18.  
  19. void create_stack(int size)
  20. {
  21.  
  22. }
  23.  
  24. void destroy_stack(void)
  25. {
  26. while(!is_empty())
  27. pop();
  28. }
  29.  
  30. void push (STACK_TYPE value)
  31. {
  32. StackNode *new_node;
  33. new_node = (StackNode *)malloc(sizeof(StackNode));
  34. assert(new_node != NULL);
  35. new_node->value = value;
  36. new_node->next = stack;
  37. stack = new_node;
  38. }
  39.  
  40. void pop(void)
  41. {
  42. StackNode *first_node;
  43.  
  44. assert(!is_empty());
  45. first_node =stack;
  46. stack = first_node->next;
  47. free(first_node);
  48. }
  49.  
  50. STACK_TYPE top(void)
  51. {
  52. assert(!is_empty());
  53. return stack->value;
  54. }
  55.  
  56. int is_empty(void)
  57. {
  58. return stack == NULL;
  59. }
  60.  
  61. int is_full(void)
  62. {
  63. return FALSE;
  64. }
  65.  
  66. int main(void)
  67. {
  68. int ret,i;
  69. //create_stack(5);
  70. for(i= ;i<;i++)
  71. {
  72. push(i);
  73. }
  74.  
  75. for(i= ;i<;i++)
  76. {
  77. ret = top();
  78. printf("dynamic data: %d\n",ret);
  79. pop();
  80. }
  81. }

队列:是一种先进先出的结构。需要两个指针:一个指向队头,一个指向队尾。

 

树:

属性:每个节点的值比它的左子树的所有节点的值都要大,但比它的右子树的所有节点的值都要小。

树的遍历:前序、中序、后序、层次遍历

前序遍历:检查节点的值->递归遍历左子树和右子树。

中序遍历:遍历左子树->检查当前节点的值->遍历右子树。。

后序遍历:遍历左右子树->检查当前节点的值。

层次遍历:逐层检查树的节点。处理根节点->处理它的孩子->处理它的孙子。

C的指针疑惑:C和指针17(经典抽象数据类型)的更多相关文章

  1. c语言指针疑惑[转载]

    c99的动态数组是在栈上面开辟的,而new出来的是在堆上面开辟的.栈和堆的地址是从两端相向增长的.栈很小,一般只有几十k,vc6好像是64k.堆很大,在win32的虚拟地址空间可以分配到2g的内存.栈 ...

  2. 指针数组 vs 数组指针

        指针数组,故名思义,就是指针的数组,数组的元素是指针:     数组指针,同样,就是直想数组的指针.     简单举例说明:     int *p[2]; 首先声明了一个数组,数组的元素是in ...

  3. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  4. c语言指针函数与函数指针

    例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...

  5. void指针、NULL指针和未初始化指针

    一个指针可以被声明为void类型,比如void *x.一个指针可以被赋值为NULL.一个指针变量声明之后但没有被赋值,叫做未初始化指针. 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  6. [C++ Primer Plus] 第7章、函数(一)程序清单——递归,指针和const,指针数组和数组指针,函数和二维数组

    程序清单7.6 #include<iostream> using namespace std; ; int sum_arr(int arr[], int n);//函数声明 void ma ...

  7. 深入理解指针—>指针函数与函数指针的区别

    一. 在学习过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数, ...

  8. C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法

    本文转载自:https://blog.csdn.net/qq_33573235/article/details/79530792 1. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...

  9. C语言-------指针函数与函数指针的区别

    一. 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某 ...

随机推荐

  1. 高精度 - SGU 112 a^b-b^a

    a^b-b^a Problem's Link Mean: 略 analyse: 简单题,只用编个高精度乘法和减法即可. Time complexity: O(N) view code  java im ...

  2. [android] AndroidManifest.xml【 manifest -> uses-permission】

    在  API Level 1 时被引入 简介: 在某些情况下,你为app设置的权限将会影响到google应用商店会用何种规则来过滤你的APP. 如果你需要一个硬件相关的权限——CAMERA,googl ...

  3. 关于Cocos2d-x中自定义的调用注意事项

    1.在实例类Student.h中定义一个自己的方法 public: int getSno(); 2.在实例类Student.cpp中实现这个方法 int Student::getSno(){ retu ...

  4. MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得。

    MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得. 之前的项目比较简单,多是用JSP .Servlet + JDBC 直接搞定,在项目中尝试用 Strut ...

  5. web 前端 转盘界面

    http://www.cnblogs.com/arfeizhang/p/turntable.html "如果有个做转盘的需求,你准备怎么做?设计师只会提供一个转盘的图片,其余都需要你完成,不 ...

  6. 【BZOJ】1009: [HNOI2008]GT考试(dp+矩阵乘法+kmp+神题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 好神的题orzzzzzzzzzz 首先我是连递推方程都想不出的人...一直想用组合来搞..看来 ...

  7. 要立刷金组flag了T_T

    刷了那么多银组,发现自己好多不会啊... 果然太弱 在这感谢hzwer神犇的blog.. 大部分题解都从黄学长这里来orz. orz.... 果然我太水

  8. HTTP报文-->MVC

    引用 学习Web开发不好好学习HTTP报文,将会“打拳不练功,到老一场空”,你花在犯迷糊上的时间比你沉下心来学习HTTP的时间肯定会多很多. HTTP请求报文解剖 HTTP请求报文由3部分组成(请求行 ...

  9. MP 及OMP算法解析

    转载自http://blog.csdn.net/pi9nc/article/details/18655239 1,MP算法[盗用2] MP算法是一种贪心算法(greedy),每次迭代选取与当前样本残差 ...

  10. 如何使用github,简单教程

    前期准备:先行设置SSH KEY(请看我之前发的关于设置添加SSH的文章) 直接上命令: clone 已有仓库到身边的开发环境中 git clone git@github.com:<yourna ...