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

用动态数组实现堆栈:

#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. 利用U盘给Intel NUC安装CentOS

    一,UltraISO(用来制作 U 盘启动) 需要新版9.6 下载地址为:http://www.onlinedown.net/soft/614.htm 软件注册码:王涛 7C81-1689-4046- ...

  2. linux文件目录连接

    linux系统下提供ln指令来进行文件链接.文件链接主要分为硬链接和软链接. 硬链接:由于linux下的文件是通过索引节点(Inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系 ...

  3. 【POJ】1523 SPF(割点)

    http://poj.org/problem?id=1523 太弱... too weak.. 割点我都还要看书和看题解来写..果然是写不出么.. 割点就那样求,然后分量直接这个节点有多少子树就有子树 ...

  4. jquery ajax 的用法

    jquery的ajax请求的主要参数 beforeSend:发送ajax请求之前 success:发送ajax请求成功 error:发送ajax请求错误,通常是网络失去连接.服务器出错.后台方法错误等 ...

  5. HTTP报文-->MVC

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

  6. php 将一个字符串分割为组成它的字符

    问: php里如何将一个字符串分割为组成它的字符? 比如hello  -> [h, e, l, l, o]   以下有三种方法: 这是需要被分割的字符串:  $str = 'Hello小样'; ...

  7. Python 正则表达式规则

    正则表达式的一些匹配规则: . :用于匹配任意一个字符,如 a.c 可以匹配 abc .aac .akc 等^ :用于匹配以...开头的字符,如 ^abc 可以匹配 abcde .abcc .abca ...

  8. iOS开发经验总结(一)

    本文转载至 :http://dreamahui.iteye.com/blog/1878650 软件开发方面 1.  在每个页面的入口和出口(一般是viewDidLoad和dealloc)打上日志,可以 ...

  9. Linux下的高级拾色器—Pick

    导读 虽然大多数设计师都在使用 Mac,但也有一少部分在使用 Windows 甚至是 Linux 系统.在 Mac 和 Windows 中都有非常丰富的拾色器工具或插件可用,反而在开源界中这类颜色选择 ...

  10. Java之线程池

    假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间.当T1 + T3 远大于 T2时,采用多线程技术可以显著减少处理器单元的闲置时间,增加处理器 ...