//既然在这里开始,那就在这里结束。

实现stack 功能

____coding

_using subfunction to focus on the main aim of current function

_void* is not allowed to do arithmetic operation

_makde sure parameters are valid before using them,especially related to pointer.

_____assert测试

assert带有一个断言作为int 类型参数,断言是指正常情况下为真的表达式。assert是一个宏,但是用函数实现的。

当参数为0,编译停止,提供参数信息输出显示。调试结束后,取消assert测试,只需加上一句

#define NDEBUG 在#include "assert.h"之前。

____void * realloc(void * p, int size);

return the same pointer in the parameter.

if current space is not enough, than go to a new place ,a pointer will be returned correspondly. The orighinal dates will be coped into the new space,2 cases: 1,integars will be copied directly. 2,if char,will consider the dates as address pointing at the char,so  in the new space ,also address is copied and stored....

____when dealing with pointers, make sure the pointer is valid one.use assert to perform the check.

____stark 的char 型实现。

typedef struct {
uchar length;
uchar allocSize;
uchar* elem;
}stack; void stackNew(stack *s);
void stackDispose(stack *s);
void stackPush(stack *s, uchar* date);
void stackPop(stack *s, uchar* date); void stackNew(stack *s)
{
assert(s!=NULL);
s->length = ;
s->allocSize = ;
s->elem = malloc(*sizeof(uchar));
assert(s->elem != NULL);
}
void stackDispose(stack *s)
{
assert(s != NULL && s->elem != NULL);
free(s->elem);
} void stackPush(stack *s, uchar* date)
{
assert(s!=NULL && date != NULL);
if(s->length == s->allocSize)
{
s->allocSize *= ; s->elem = realloc(s->elem,s->allocSize); //reallocate designate size
assert(s->elem != NULL);
}
*(s->elem+s->length) = *date; //s->elem[s->length-1] = *date;
s->length += ;
} void stackPop(stack *s, uchar* date)
{
assert(s!=NULL && date!=NULL); assert(s->length >= ); --s->length;
*date = s->elem[s->length];
}

stack generic function

typedef struct {
void* elem;
uchar elemSize;
uchar logicalLen;
uchar allocSize;
}stack; void stackNew(stack *s,uchar elemSize);
void stackDispose(stack *s);
void stackPush(stack *s,void* elemAdder);
void stackPop(stack *s,void* elemAdder); void stackNew(stack *s,uchar elemSize)
{
assert(s!=NULL);
assert(elemSize >= ); //parameter check s->elemSize = elemSize;
s->logicalLen = ;
s->allocSize = ;
s->elem = malloc(*elemSize);
assert(s->elem != NULL);
} void stackDispose(stack *s)
{
assert(s != NULL && s->elem != NULL);
free(s->elem);
} static void stackGrow(stack*s) // use static to prenvent the calling from other files.
{
s->allocSize *= ;
s->elem = realloc(s->elem,s->allocSize); //reallocate designate size
assert(s->elem != NULL);
} void stackPush(stack *s,void* elemAdder)
{
// assert(s!=NULL && elemAdder != NULL);
if(s->logicalLen == s->allocSize)
{
////Using subfunction to focuse one the key point.
stackGrow(s);
}
//// void* is not allowed to perform arithmetic operation
void* target = (uchar*)s->elem + s->logicalLen * s->elemSize;
memcpy(target,elemAdder,s->elemSize);
s->logicalLen += ;
} void stackPop(stack *s, void* elemAddre)
{
// assert(s!=NULL && elemAdder != NULL);
assert(s->logicalLen >= ); s->logicalLen -= ;;
void* position = (uchar*)s->elem + s->logicalLen * s->elemSize;
memcpy(elemAddre,position,s->elemSize);
}
int main()
{
const char* friends[3] = {"a1","b2","c3"};
stack stringStack;
uchar i;
uchar* copy;
stackNew(&stringStack,sizeof(uchar**)); for(i = ;i < ;i++)
{
copy =strdup(friends[i]);
stackPush(&stringStack,&copy);
}
char *name;
for(i = ; i < ; i++)
{
stackPop(&stringStack,&name);
printf("%s\n",name);
free(name);
}
stackDispose(&stringStack);
return ;
}

//在之前的程序上修改新的功能时,多了出现bug的机会

一行一行检查,避免疏忽造成的错误

就算出错了也不要紧,一行一行找,总是可以找到问题。

这世界上再也没有比程序的运行更确定的事情,这也是我喜欢这一行的原因

编程范式 episode 6 实现stack 栈功能_ to do的更多相关文章

  1. 编程范式 epesode7,8 stack存放指针类型and heap,register

    这一节从后往前写. ____stack and heap ___stack由 汇编语言操控管理,数据先入后出. 栈是存放局部变量,函数调用子函数时,该函数在栈中占用的空间会增大,用于存放子函数的局部变 ...

  2. 编程范式感想(一)——在C中进行对模板功能的实现

    最近一直在看网易公开课上的编程范式的公开课,斯坦福的教授讲的真的非常到位,感觉还是要好好学习下C还有汇编,熟悉下计算机的内存机制什么的. 大家都知道关于模板或者说范式的问题,基本在很多高级语言上都有实 ...

  3. STM32编程:是时候深入理解栈了

    [导读] 从这篇文章开始,将会不定期更新关于嵌入式C语言编程相关的个人认为比较重要的知识点,或者踩过的坑. 为什么要深入理解栈?做C语言开发如果栈设置不合理或者使用不对,栈就会溢出,溢出就会遇到无法预 ...

  4. java - Stack栈和Heap堆的区别

    首先分清楚Stack,Heap的中文翻译:Stack—栈,Heap—堆.         在中文里,Stack可以翻译为“堆栈”,所以我直接查找了计算机术语里面堆和栈开头的词语:        堆存储 ...

  5. Heap(堆)和stack(栈)有的区别是什么。

    java的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个 ...

  6. JAVA Stack栈和Heap堆的区别(转)

          首先分清楚Stack,Heap的中文翻译:Stack—栈,Heap—堆.         在中文里,Stack可以翻译为“堆栈”,所以我直接查找了计算机术语里面堆和栈开头的词语:      ...

  7. 容器vector的使用总结 容器stack(栈)

    0.头文件:#include<vector>; using namespace std; 1.定义: vector<type> vec; 2.迭代器 vector<typ ...

  8. Linux Kernel C语言编程范式

    介绍 不同的编程语言具有不同的抽象原语(如下),有的原语抽象层次低,有的原语抽象层次高.其中函数式.DSL是这几年十分热门的编程语言概念. 过程式抽象原语:变量 对象式抽象原语:对象 函数式抽象原语: ...

  9. jQuery中的编程范式

    浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...

随机推荐

  1. C++概念整理

    /* 面向对象: 多态, 继承 封装 */ #include <stdio.h> #include <stdlib.h> //一旦有了纯虚函数,该对象就不能实例化了. #def ...

  2. VoxelGrid体素滤波器对点云进行下采样

    使用体素化网格方法实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准.曲面重建.形状识别等算法速度中非常实用. PCL实现的VoxelGrid类通过输入的点云数据创建一个三 ...

  3. bk.

    http://ol.tgbus.com/zt2013/gzsnew/ 巴士盘点 十大游戏工作室 http://bbs.3dmgame.com/forum.php?mod=viewthread& ...

  4. WPF 中保存 window(窗口)或者canvas成图片

    最近需要用到这个功能,搜了一下不少代码有问题 ,找到一个效果比较好的,支持多级子元素 记一下. private void button_save_window_Click(object sender, ...

  5. Appium for win7 环境搭建

    一.安装node.js 1.到官网下载node.js:https://nodejs.org/download/ 2.获取到安装文件后,直接双击安装文件,根据程序的提示,完成nodejs的安装. 3.安 ...

  6. SpringMVC学习系列(10) 之 异常处理

    在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的.那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异 ...

  7. StackOverflow程序员推荐的几本书籍

    1. <代码大全>史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,<代码大全>注重个人技术,其中所有东西加起来,就是我们本能所说的“编写整洁的代码”.这本书有 ...

  8. 物流公司统计按物资类别采购的前二十家sql

    2.集团主要的供应商(按物资分类列举前10或20家名单),年采购金额.占比,结算方式,付款周期:(夏) 年份要求是2013年 arap_djfb中的单据日期不是常规的日期类型 需要做这样的转换才可以 ...

  9. python中获取当前所有的logger

    获得当前所有logger的列表的程序如下: import logging for name in logging.Logger.manager.loggerDict.keys(): logger = ...

  10. duplicate symbols for architecture armv7解决办法

    XCODE编译的时候报错:duplicate symbols for architecture armv7   1.首先排查是否有名字重复的文件:   2.检查是否在#import头文件的时候,不小心 ...