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

用动态数组实现堆栈:

#include "C17.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h> static STACK_TYPE *stack;
//static size_t stack_size
static int stack_size;
static int top_element = -; void create_stack(int size)
{
assert(stack_size == );
stack_size = size;
stack = (STACK_TYPE *)malloc(stack_size * sizeof(STACK_TYPE));
assert(stack != NULL);
} void destroy_stack(void)
{
assert(stack_size > );
stack_size = ;
free (stack);
stack = NULL;
} void push (STACK_TYPE value)
{
assert(! is_full());
top_element += ;
stack[top_element] = value;
} void pop(void)
{
assert(!is_empty());
top_element -= ;
} STACK_TYPE top(void)
{
assert(!is_empty());
return stack[top_element];
} int is_empty(void)
{
assert(stack_size > );
return top_element == -;
} int is_full(void)
{
assert(stack_size > );
return top_element == stack_size -;
} int main(void)
{
int ret,i;
create_stack();
for(i= ;i<;i++)
{
push(i);
} for(i= ;i<;i++)
{
ret = top();
printf("dynamic data: %d\n",ret);
pop();
}
}

链式堆栈:

#include "C17.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h> #define FALSE 0 typedef struct STACK_NODE
{
STACK_TYPE value;
struct STACK_NODE *next;
}StackNode; static StackNode *stack;
//static int stack_size;
//static int top_element = -1; void create_stack(int size)
{ } void destroy_stack(void)
{
while(!is_empty())
pop();
} void push (STACK_TYPE value)
{
StackNode *new_node;
new_node = (StackNode *)malloc(sizeof(StackNode));
assert(new_node != NULL);
new_node->value = value;
new_node->next = stack;
stack = new_node;
} void pop(void)
{
StackNode *first_node; assert(!is_empty());
first_node =stack;
stack = first_node->next;
free(first_node);
} STACK_TYPE top(void)
{
assert(!is_empty());
return stack->value;
} int is_empty(void)
{
return stack == NULL;
} int is_full(void)
{
return FALSE;
} int main(void)
{
int ret,i;
//create_stack(5);
for(i= ;i<;i++)
{
push(i);
} for(i= ;i<;i++)
{
ret = top();
printf("dynamic data: %d\n",ret);
pop();
}
}

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

 

树:

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

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

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

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

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

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

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. VS2013 连接 MySQL

    1.安装必须的工具: mysql-connector-net-6.8.3 mysql-installer-community-5.6.16.0.msi mysql-for-visualstudio-1 ...

  2. 动态加载javascript增强版

    我们经常使用动态加载Javascript,写个函数很容易现实,之前也写过一个函数,不过当加载多个JS时,只能根据浏览器返回的顺序来先后加载,这肯定不是我们想要的,现在使用了一下技巧,当加载多个JS时, ...

  3. imx lcd HV和DE模式转换

    有些时候拿到的lcd手册中关于芯片的时序使用的DE模式的,而imx6内核中使用的参数设置趋势HV模式,应此就需要将DE模式的参数转化为HV模式. 参考链接: https://community.nxp ...

  4. web 前端 转盘界面

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

  5. json 转 T

    T test = JsonConvert.DeserializeObject<T>(json);(json.net)

  6. DecimalFormat 四舍五入Float类型的坑

    今天又踩了一个坑,使用DecimalFormat来完毕四舍五入.可是传入的是float类型,几轮測试才发现一个问题,传入的float会被转为double类型.大家都知道float是4位,double是 ...

  7. 编程之美 set 2 精确表达浮点数

    有限小数和无限循环小数转化成分数 比如 0.9 ->  9/10 0.333(3) -> 1/3 解法 1. 主要涉及到一个数学公式的计算. 2. 对于有限小数, 分子分母求最大公约数即可 ...

  8. 打印出现:You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:

    解决办法: 第一种:Product -> Target -> Capabilities -> Background Modes -> 勾选Remote notification ...

  9. Shell脚本编程与文件系统修复

    导读 Linux基金会发起了LFCS认证(Linux 基金会认证系统管理员)Linux Foundation Certified Sysadmin,这是一个全新的认证体系,旨在让世界各地的人能够参与到 ...

  10. Android XListView下拉刷新、上拉载入更多

    source code: https://github.com/Maxwin-z/XListView-Android 提供了两个接口: a) IXListViewListener:  触发下拉刷新.上 ...