最近在搞摄像头驱动,o()︿︶)o 唉,别提有多烦,一堆寄存器就有人受的了……特么这不是单片机的开发,这是内核驱动开发……

今天放松一下,我们来看看数据结构中的栈,这节的知识点可以说是数据结构中最容易上手的知识点了,其实比起链表,其实链表也有栈和队列的模型,链表的头插其实就是后进先出,链表的尾插其实就是先进先出,这不就是栈和队列吗,哈哈,不知道学习数据结构的时候有没有意识到这一点,但是栈和队列和链表还是有所区别的,我们来看看。

首先了解一下,什么是栈?

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈可以用来在函数调用的时候存储断点,做递归时要用到栈!最著名的实例便是汉诺塔,汉诺塔可以用递归来实现。

栈的生长方向是从高地址到低地址。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。

注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;ESP所指的栈帧顶部和系统栈的顶部是同一个位置。

在操作系统中,每一个线程都有一个栈,但是每个应用程序通常都只有一个堆,当然在为不同类型分配内存的时候使用多个堆并不是不可能。

那栈有什么特点?

1.  和堆一样存储在计算机 RAM
中。

2.  在栈上创建变量的时候会扩展,并且会自动回收。

3.  相比堆而言在栈上分配要快的多。

4.  用数据结构中的栈实现。

5.  存储局部数据,返回地址,用做参数传递。

6.  当用栈过多时可导致栈溢出(无穷次(大量的)的递归调用,或者大量的内存分配)。

7.  在栈上的数据可以直接访问(不是非要使用指针访问)。

8.  如果你在编译之前精确的知道你需要分配数据的大小并且不是太大的时候,可以使用栈。

9.  当你程序启动时决定栈的容量上限。

栈的算法主要由以下步骤构建而成:

进栈(PUSH)算法

①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);

,指向进栈地址);

③S(TOP)=X,结束(X为新进栈的元素);

.退栈(POP)算法

①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈,空则下溢;不空则作②);

②X=S(TOP),(退栈后的元素赋给X):

,指向栈顶)。

说了这么多。以上是我对栈的理解,其实栈如果挖深一点,其实也是很深的,最精华的东西还是会跟指针结合到一起。先不研究太深的东西,我们还是直接上代码,看看到底是怎么回事,我的代码就依照栈的算法来实现:

#include <stdio.h>
#include <string.h>

int stack[20];
int max = 20;
int top = 0;			//设置栈	

//栈的初始化
void stack_init(void)
{
	memset(stack, 0, max);
	top = 0;
}

//判断栈是不是满了
int is_full(void)
{
	return top == max;
}
//入栈
int stack_push(int data)
{
	if(is_full())
	{
		return -1;
	}

	stack[top] = data;
	top ++;

	return 0;
}

//判断栈是否为空
int is_empty(void)
{
	return top == 0;
}

//出栈
int stack_pop(void)
{
	if(is_empty())
		return -1;

	top --;
	return stack[top];
}
//判断是不是在栈顶
int stack_top(void)
{
	return stack[top - 1];
}

int main(void)
{
	stack_init();  //初始化栈 

	int i;
	for(i = 0; i < 20; i++)
	{
		stack_push(i);  //将0-19这20个数入栈
	}

	printf("top = %d\n", stack_top());  //打印出栈顶的元素 

	for(i = 0; i < 20; i++)
	{
		printf("val = %d\n", stack_pop());  //出栈
	}
}

运行结果:

是最后进的,所以最先出,所以你会看到,我们的栈的生长方向即是从高处往低处走。

好了,今天打了下酱油,就到这里,准备早早睡觉!以后早早起床上班,才能早早的下班争取多点时间出来学习。下期播报:数据结构中的队列。

我的QQ空间博客: http://user.qzone.qq.com/826148759/appstore?via=QZ.DERECT.APPCENTER

浅析数据结构中栈与C实现的更多相关文章

  1. jvm 中内存的栈和数据结构中的栈的区别

    1.常见的数据结构:栈.队列.数组.链表和红黑树,java内存划分 2.JYM中的栈是先进先出,先入栈的先执行: 2.数据结构中的栈是先进后出,类似手枪的弹夹,先进入的子弹最后才发射: 3.数据结构中 ...

  2. Stack的三种含义(数据超过栈的大小,就发生stack overflow)

    非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...

  3. 数据结构中的棧在C#中的实现

    数据结构中的棧在C#中的实现 一.大致学习 棧是一种面向表的数据结构,棧中的数据只能在标的某一短进行添加和删除操作,是一种典型的(LIFO)数据结构. 现实生活中的理解:自助餐厅的盘子堆,人们总是从顶 ...

  4. 使用JavaScript的数组实现数据结构中的队列与堆栈

    今天在项目中要使用JavaScript实现数据结构中的队列和堆栈,这里做一下总结. 一.队列和堆栈的简单介绍 1.1.队列的基本概念 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被 ...

  5. JavaScript学习总结(二十一)——使用JavaScript的数组实现数据结构中的队列与堆栈

    今天在项目中要使用JavaScript实现数据结构中的队列和堆栈,这里做一下总结. 一.队列和堆栈的简单介绍 1.1.队列的基本概念 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被 ...

  6. 面试题:java内存中的堆区和数据结构中的堆有什么区别

    java内存中的堆是一个  链表, 数据结构中的堆:就是一个栈

  7. [Data Structure] 数据结构中各种树

    数据结构中有很多树的结构,其中包括二叉树.二叉搜索树.2-3树.红黑树等等.本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂. 1. 二叉树 二叉树是数据结构中一种重要 ...

  8. 数据结构中很常见的各种树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B+树.B*树) 二叉排序树.平衡树.红黑树 红黑树----第四篇:一步一图一代码,一定要让你真正彻底明白红黑树 --- ...

  9. 大数据全栈式开发语言 – Python

    前段时间,ThoughtWorks在深圳举办一次社区活动上,有一个演讲主题叫做“Fullstack JavaScript”,是关于用JavaScript进行前端.服务器端,甚至数据库(MongoDB) ...

随机推荐

  1. leetcode 5 Longest Palindromic Substring--最长回文字符串

    问题描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  2. Android5.0特性ToolBar

    >Toolbar是什么?大概说一下它的官方介绍.Toolbar是应用的内容的标准工具栏,`可以说是Actionbar的升级版`,两者不是独立关系,要使用Toolbar还是得跟ActionBar扯 ...

  3. HDFS基本原理及数据存取实战

    ---------------------------------------------------------------------------------------------------- ...

  4. Android布局概述

    布局 布局定义用户界面的视觉结构,如Activity或应用小部件的 UI.您可以通过两种方式声明布局: 在 XML 中声明 UI 元素.Android 提供了对应于 View 类及其子类的简明 XML ...

  5. Android的Ui层次

    UI 概览 Android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成.View 对象用于在屏幕上绘制可供用户交互的内容.ViewGroup 对象用于储存其他 V ...

  6. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

    上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...

  7. Scikit-learn:模型选择Model selection

    http://blog.csdn.net/pipisorry/article/details/52250983 选择合适的estimator 通常机器学习最难的一部分是选择合适的estimator,不 ...

  8. FORM触发器

     FORM级触发器 PRE-FORM该触发器是在用户双击功能后,进入form前 WHEN-NEW-FORM-INSTANCE该触发器是在用户一进入form时执行 WHEN-FORM-NAVIGAT ...

  9. Android中常用开发工具类—持续更新...

    一.自定义ActionBar public class ActionBarTool { public static void setActionBarLayout(Activity act,Conte ...

  10. Android初级教程通过简要分析“土司”源码,来自实现定义土司理论探讨

    由于系统自带的土司瞬间即逝,而且非常难看.因此我们就希望自定义自己的土司风格.有些实例就是基于自定义土司完成的,例如金山卫士的火箭发射,基本原理就是个土司.但是在做出自己的土司风格之前,还是要简要分析 ...