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

用动态数组实现堆栈:

#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. xubuntu14.04下编译pjsip及pjsua2 java

    Run "./configure" without any options to let the script detect the appropriate settings fo ...

  2. selenium运行火狐报错FirefoxDriver : Unable to connect to host 127.0.0.1 on port 7055

    摘要: 这是个常见的启动firefoxdriver的问题,具体的错误日志如下,其实原因很简单,就是你的Selenium版本和firefox 不兼容了. Firefox 版本太高了, 请及时查看你安装的 ...

  3. 第二百七十四节,同源策略和跨域Ajax

    同源策略和跨域Ajax 什么是同源策略  尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措 ...

  4. Maven实战(三)——多模块项目的POM重构

    在本专栏的上一篇文章POM重构之增还是删中.我们讨论了一些简单有用的POM重构技巧,包含重构的前提--持续集成,以及怎样通过加入或者删除内容来提高POM的可读性和构建的稳定性.但在实际的项目中,这些技 ...

  5. gcc参数PIE和PIC的区别和共同点

    gcc参数的PIE和PIC 区别 PIE:用在可执行文件 PIC:用在库文件 共同点 生成跟位置没有关系的symbol

  6. python入门(十):XML和JSON解析

    一.python解析XML 1.xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合,注意xml.dom包里面有许多模块,须区分它们间的不同: 2.xml. ...

  7. ielowutil.exe应用程序错误解决方法

    转载: http://wenda.so.com/q/1484111785202192 控制台方法: .按住“Window”+“R”->输入“cmd”->确定 .输入“ ”->回车-& ...

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

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

  9. webpack配置(一)

    这里再配置的时候走了些弯路,现在,把配置前的准备工作做好很重要: 首先,安装node.js,当然,npm也就有了: 其次,安装xampp,主要是为了配置Apache: 安装好后,xampp---htd ...

  10. 1:TwoSum(如果两个和为某个数,找出这俩数的位置)

    package leetcode; import java.util.HashMap; import java.util.Map; /** * @author mercy *Example: *Giv ...