精华内容
下载资源
问答
  • Stack.htypedef struct {void *elems;int elemSize;int logicalLen;int allocLen;}Stack;void StackNew(Stack *s,int elemSize);void StackDispose(Stack *s);void StackPush(Stack *s,void *elemAddr);...

    Stack.h

    typedef struct {

    void *elems;

    int elemSize;

    int logicalLen;

    int allocLen;

    }Stack;

    void StackNew(Stack *s,int elemSize);

    void StackDispose(Stack *s);

    void StackPush(Stack *s,void *elemAddr);

    void StackPop(Stack *s,void *elemAddr);

    static void StackGrow(Stack *s);

    Stack.c

    #include

    #include

    #include

    #include

    #include "stack.h"

    int main(){

    Stack s;

    StackNew(&s,sizeof(int));

    int i = 0;

    for(i = 0; i < 10; ++i){

    StackPush(&s,&i);

    }

    for(i = 0; i < 10; ++i){

    int number = 0;

    StackPop(&s,&number);

    printf("%d ",number);

    }

    printf("\n");

    StackDispose(&s);

    return 0;

    }

    void StackNew(Stack *s,int elemSize){

    assert(elemSize > 0);

    s->elemSize = elemSize;

    s->logicalLen = 0;

    s->allocLen = 4;

    s->elems = malloc(s->allocLen * elemSize);

    assert(s->elems != NULL);

    }

    void StackDispose(Stack *s){

    free(s->elems);

    }

    void StackPush(Stack *s,void *elemAddr){

    if(s->logicalLen == s->allocLen){

    StackGrow(s);

    }

    void *target = (char *)s->elems + s->logicalLen * s->elemSize;

    memcpy(target,elemAddr,s->elemSize);

    s->logicalLen ++;

    }

    static void StackGrow(Stack *s){

    s->allocLen *= 2;

    s->elems = realloc(s->elems,s->allocLen * s->elemSize);

    assert(s->elems != NULL);

    }

    void StackPop(Stack *s,void *elemAddr){

    assert(s->logicalLen > 0);

    s->logicalLen --;

    void *source = (char *)s->elems + s->logicalLen * s->elemSize;

    memcpy(elemAddr,source,s->elemSize);

    }

    展开全文
  • c语言构建 Java社区中有许多关于Spring vs Java EE的话题。 一群人会争辩说您应该使用一个而不是其他。等等。当我看到这一点时,我不禁要想为什么我们不能同时使用它们呢? 实际上,我认为有效地使用它们将为建立...

    c语言构建栈

    Java社区中有许多关于Spring vs Java EE的话题。 一群人会争辩说您应该使用一个而不是其他。等等。当我看到这一点时,我不禁要想为什么我们不能同时使用它们呢? 实际上,我认为有效地使用它们将为建立基础架构创建一个伟大的技术堆栈,例如,为一家大型公司,该公司希望提供一个可以托管和运行许多不同应用程序和项目的通用平台。

    为什么将Spring和Java EE结合在一起?

    在编写软件时,我们创建和构建可重复使用的库/框架,并帮助我们更快地完成工作。 Spring是一个像瑞士军刀一样的库,它允许以非侵入性的方式构建应用程序,并具有许多更简单的包装器和帮助器类。 这就是我所说的“对开发人员友好”的库。

    但是,许多人没有意识到Spring只是一个包含对许多可以简化开发的事物进行包装的库。 例如,Spring具有一个Web框架层,可让您编写MVC Web应用程序,但您仍需要一个Servlet容器(服务器)。 Spring提供的数据层主要包装了其他JPA / Hibernate / JDBC,这些JPA / Hibernate / JDBC很好地集成在了它们的IoC容器中,但是实际的ORM实现不在Spring之外(例如:Hibernate)。 Spring包装了JMS甚至JNDI进行开发,但是您仍然需要JMS服务器或JNDI提供程序。 Spring有一个事务管理器抽象层,但它只是一个包装器(对于单个数据库,实际上是数据库供应商提供了交易保证的ACID属性,而不是Spring)。 如果要在多个资源(例如JMS和数据库,或多个数据库)上进行原子事务,则仍然需要“真实”事务管理器(JTA)!

    所以现在您看到,要构建成功的企业应用程序,您需要在许多供应商提供的功能之上使用Spring。 如果您不小心,可能会陷入难以集成和部署的许多专有服务中。 这就是Java EE的用武之地。这是规范布局,供应商必须以标准方式提供大多数这些服务。 因此,任何JEE法规遵从性服务器都将提供具有标准API的服务,该标准API应当以类似的方式工作。

    现在必须保持平衡。 根据我的经验,您执行的标准越多,获得的“对开发人员友好的”就越少。 但是同时,如果没有标准,很难提供通用的基础结构,例如API,运行时服务器甚至OS环境进行部署。 这就是我认为将Spring与Java EE相结合将为IT社区带来更实用,更有效的平台的原因。

    选择技术栈

    并非每个项目的创建都是平等的,他们的需求在很大程度上不同。 因此,不可能提供一个能够满足所有项目需求的通用技术堆栈。 但是我们当然可以尝试创建一个可以满足大多数项目需求的通用工具。 同样,选择一个具体的库/堆栈是非常有根据的,无论选择哪种实际实现,总是会有利弊的。 考虑到这一点,我将尝试提出自己对技术栈的个人选择,我认为它将为承载各种项目和应用程序提供最灵活的平台。 特别是在大型公司环境中。

    我将选择Java EE应用程序服务器作为通用平台。 从中,我将选择一些“对开发人员友好”的库来代替(或添加一些现有的EE标准),以提高生产率。 我认为EE已经走了很长一段路,并且在每次规范迭代中都变得更好,但是我仍然觉得将POJO服务连接在一起时,使用Spring作为IoC容器比使用CDI有更大的灵活性。 另外,Spring框架带有非常灵活的MVC层,与普通的Servlet API相比,该层有效且易于开发。

    使用Java EE 6,服务器必须提供两个配置文件。 因此,让我们从这两个视图开始探索堆栈。

    JEE Web配置文件–基于Web的轻量级应用

    • 使用Spring MVC(控制器,表单,验证,ModelAndView和IoC配置)代替普通的Servlet API编程。
    • 使用尽可能多的POJO编写后端业务服务逻辑,并使用Spring IoC进行连接。 不要滥用这个。 我个人认为,与CDI相比,Spring IoC更灵活,更易于使用。
    • 将JPA用于数据服务层而不是JDBC API编程。
    • 使用JSON数据交换格式。 根据经验,与XML相比,JSON更加高效且易于使用。
    • 视图选项:
        使用格式正确的xhtml / Bootstraps / jquery / AJAX->如果您只需要静态页面和一些客户端交互
    • Servlet 3.0现在支持异步请求。 这解决了Web域中的许多难题。 如果需要,可以利用它! (最新的Spring MVC已经对此提供支持。)

    JEE 6完整个人资料–完整EE功能应用程序

    • 在上面的所有Web配置文件中提到。
    • 将JMS用于属于点对点或发布/订阅域的任何消息传递需求。
    • 当您需要原子事务进行多个数据库和/或JMS交付时,请使用JTA。
    • 使用标准的JAX-RS(RESTful Web服务API)来公开外部服务。 使用JSON数据交换格式。
    • 使用一致的Spring IoC进行服务注入。 与CDI相比,它更灵活,更易于使用。
    • 如果可能的话,使用POJO服务并通过Spring代替EJB进行连接。 我发现它们更易于测试和开发。
    • 加上它所支持的其他任何EE规范,例如(JavaMail和JCA等。通常,Spring也会为这些API提供更简单的包装。)

    Apache Camel –轻量级ESB

    Camel项目不是EE标准。 但是,我的经验是,使用简单的Camel路由/工作流可以轻松完成许多常见的IT工作。 Camel的开发和样式易于理解且易于测试。 它可以作为独立的应用程序/服务运行,也可以作为Web应用程序的一部分运行。 我相信,在上面的通用平台之上添加一个巨大的价值。 您将在需要以下各项时使用它:

    • 对于任何类似工作流流程的集成模式(例如:将文件轮询器桥接到Web服务,将JMS队列桥接到数据库等)
    • 用于创建业务工作流程。
    • 适用于任何ETL工作流程。
    • 为了轻松将业务需求工作流映射到代码逻辑流程

    使用哪个EE应用程序服务器

    我认为这也是主观的,但是我们需要选择适合我们业务需求的产品。 我个人更喜欢JBoss,因为它是开源的,但是他们提供了其应用服务器的商业支持版本。 作为基于开源的产品,它使开发人员在学习和探索平台方面具有更大的灵活性。 我还看到了他们内部项目的许多好处,例如开放的测试工具和库,这些都使平台开发人员受益。

    Tomcat服务器呢?

    Tomcat是一个非常著名的Servlet容器。 但是,它只是一个支持Servlet / JSP应用程序的Web容器。 它不提供Java EE服务器提供的JMS或JTA功能。 事实上,仅使用一个简单的Tomcat服务器就可以满足许多Web应用程序的需求。 但是,在大型IT环境中,您经常需要仅由Java EE服务器提供的其他服务。 在许多情况下,人们将只需要运行Tomcat webapp并在需要时桥接到其他Java EE服务器。

    使用JEE6,可以将Web配置文件简化为大多数Web容器功能,这应该使服务器启动更快(加载更少的额外服务)。 但是,如果应用程序需要额外的EE功能,我们提供的平台将能够支持它们。

    参考:A Programmer's Journal博客 ,选择我们JCG合作伙伴 Zemian Deng的技术堆栈来构建通用平台

    翻译自: https://www.javacodegeeks.com/2013/06/choosing-technology-stack-to-build-a-common-platform.html

    c语言构建栈

    展开全文
  • C语言--通用类型

    2016-05-29 17:12:00
    //字符串存储示例 int main() { stack stringStack; char *name[]={"Apig","Bdog","Cfox"}; StackNew(&stringStack,sizeof(char *)); for(int i=0;i;i++){ StackPush(&stringStack,&name[i]); } for(int i=...
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <string.h>
    
    typedef struct {
        void *elems;
        int elemSize;
        int logicLen;
        int allocLen;
    }stack;
    
    void StactNew(stack *,int);
    void StackDispose(stack *);
    void StackPush(stack *,void *);
    void StackPop(stack *,void *);
    
    void StackNew(stack *s,int elemSize)
    {
        s->elemSize=elemSize;
        s->logicLen=0;
        s->allocLen=4;
        s->elems=malloc(s->allocLen*s->elemSize);
        assert(s->elems!=NULL);
    }
    
    void StackDispose(stack *s)
    {
        free(s->elems);
    }
    
    void StackPush(stack *s,void *elemAddr)
    {
        if(s->logicLen==s->allocLen){
            s->allocLen*=2;
            s->elems=realloc(s->elems,s->allocLen*s->elemSize);
            assert(s->elems!=NULL);
        }
        void *target;
        target=(char *)s->elems+s->logicLen*s->elemSize;
        memcpy(target,elemAddr,s->elemSize);
        s->logicLen++;
    }
    
    void StackPop(stack *s,void *elemAddr)
    {
        assert(s->logicLen>0);
        s->logicLen--;
        void *source;
        source=(char *)s->elems+s->logicLen*s->elemSize;
        memcpy(elemAddr,source,s->elemSize);
    }
    //字符串栈存储示例
    int main()
    {
        stack stringStack;
        char *name[]={"Apig","Bdog","Cfox"};
        StackNew(&stringStack,sizeof(char *));
        for(int i=0;i<3;i++){
            StackPush(&stringStack,&name[i]);
        }
        for(int i=0;i<3;i++){
            char *getS;
            StackPop(&stringStack,&getS);
            printf("The string %d is %s.\n",i,getS);
        }
        StackDispose(&stringStack);
    
        return 0;
    }

    转载于:https://www.cnblogs.com/jerehao/p/5539845.html

    展开全文
  • 通用栈的设计和实现[C语言]

    千次阅读 2013-03-09 02:05:23
    ①、栈的定义 typedef struct { void **base; /* 栈底 */ void **top;...在此设计的通用栈将会达到以下两点要求:   ①、可以处理任意的数据类型的数据  请注意栈中base和top的数据类型,其为void**


    1 栈定义

    typedef struct
    {
    	void **base; /* 栈底 */
    	void **top;  /* 栈顶 */
    	int size;    /* 栈的大小 */
    }stack_t;

    代码1 栈定义

    在此设计的通用栈将会达到以下两点要求:

    1) 可以处理任意的数据类型

    请注意栈中base和top的数据类型,其为void**,因此其可以处理各种数据类型

    2) 高效的数据操作和访问

      void**其为双指针,意味入栈和出栈的将只是对应数据的地址,而不需要对数据本身进行拷贝,因此也达到了高效的目的。


    2 宏定义

      为提高栈的操作访问效率,可使用宏定义:

    #define stack_maxsize(stack) (stack->size)
    #define stack_isempty(stack) (stack->top == stack->base)
    #define stack_depth(stack) (stack->top - stack->base)
    #define stack_gettop(stack) ((stack->top == stack->base)? NULL: *(stack->top - 1))

    代码2 宏定义

    3 操作接口

    /****************************************************************************** 
     **函数名称: stack_init
     **功    能: 初始化栈
     **输入参数:
     **    stack: 栈
     **    size: 栈的容量
     **输出参数: NONE
     **返    回: 0:成功 !0:失败
     **实现描述:
     **    1. 申请空间
     **    2. 初始化变量
     **注意事项:
     **作    者: # Qifeng.zou # 2013.03.09 #
     ******************************************************************************/
    int stack_init(stack_t *stack, int size)
    {
        memset(stack, 0, sizeof(stack_t));
    
        stack->base = (void**)calloc(size, sizeof(void*));
        if(NULL == stack->base)
        {
            return -1;
        }
        stack->top = stack->base;
        stack->size = size;
        return 0;
    }

    代码3 初始化

    /******************************************************************************
     **函数名称: stack_push
     **功    能: 压栈
     **输入参数:
     **    stack: 栈
     **    node: 入栈数据
     **输出参数: NONE
     **返    回: 0:成功 !0:失败
     **实现描述:
     **    1. 判断栈是否已满
     **    2. 将栈顶指针指向入栈数据
     **    3. 栈顶指针加1
     **注意事项:
     **作    者: # Qifeng.zou # 2013.03.09 #
     ******************************************************************************/
    int stack_push(stack_t *stack, void *node)
    {
        if(stack->top - stack->base >= stack->szie)
        {
            return -1;
        }
        *(stack->top) = node;
        stack->top++;
        return 0;
    }

    代码4 入栈

    /******************************************************************************
     **函数名称: stack_pop
     **功    能: 出栈
     **输入参数:
     **    stack: 栈
     **输出参数: NONE
     **返    回: 0:成功 !0:失败
     **实现描述:
     **    1. 判断栈是否已空
     **    2. 栈顶指针减1
     **注意事项:
     **    注意:只负责数据出栈,而不负责出栈数据的释放!
     **作    者: # Qifeng.zou # 2013.03.09 #
     ******************************************************************************/
    int stack_pop(stack *stack)
    {
        if(stack->top == stack->base)
        {
            return -1;	
        }
        stack->top--;
        *(stack->top) = NULL;
        return 0;
    }

    代码5 出栈
    /******************************************************************************
     **函数名称: stack_destroy
     **功    能: 释放栈
     **输入参数:
     **    stack: 栈
     **输出参数: NONE
     **返    回: 0:成功 !0:失败
     **实现描述:
     **    1. 释放空间
     **    2. 重置变量
     **注意事项:
     **作    者: # Qifeng.zou # 2013.03.09 #
     ******************************************************************************/
    void stack_free(stack_t *stack)
    {
    	free(stack->base);
    	stack->base = NULL;
    	stack->top = NULL;
    	stack->size = 0;
    }
    

    代码6 销毁

    展开全文
  • C语言实现通用数据类型结构

    千次阅读 2013-04-27 00:41:49
    Stack.h typedef struct { void *elems; int elemSize; int logicalLen; int allocLen; }Stack; void StackNew(Stack *s,int elemSize); void StackDispose(Stack *s);...void StackPush(Stack *s,v
  • 这是在通用链表的基础上实现的椎,关于链表的实现参见:http://blog.csdn.net/swwlqw/article/details/22498833。  这里所说的椎就是指的。   注意椎中只存储了指针,没有储存实际的数据。 ...
  • C语言通用双向循环链表操作函数集

    千次阅读 2017-05-17 15:30:42
     可基于该函数集方便地构造或队列集。  本函数集暂未考虑并发保护。   一 概念  链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现。链表由一系列存储...
  • 通用栈

    千次阅读 2012-04-18 14:37:42
    那如何写一个通用呢。在C++中有模板,那如何用C实现通用呢。 在C语言中,不同的数据类型,占用的字节数不一样。参考qsort对不同数据类型的排序方法,可以得知,使用一个指针,以及此类型的大小即可。 具体...
  • C语言通用范例开发金典.part2.rar

    热门讨论 2012-08-31 14:18:18
    范例1-26 顺序公用 59 ∷相关函数:push函数 pop函数 1.2.4 进制转换问题 61 范例1-27 进制转换问题 61 ∷相关函数:MultiBaseOutput函数 1.2.5 顺序队列操作 64 范例1-28 顺序队列操作 64 ∷相关函数:...
  • C语言通用范例开发金典.part1.rar

    热门讨论 2012-08-31 14:09:26
    范例1-26 顺序公用 59 ∷相关函数:push函数 pop函数 1.2.4 进制转换问题 61 范例1-27 进制转换问题 61 ∷相关函数:MultiBaseOutput函数 1.2.5 顺序队列操作 64 范例1-28 顺序队列操作 64 ∷相关函数:...
  • C语言通用数据类型链表的实现

    千次阅读 2009-09-24 09:22:00
    可接受任意类型的数据的C语言链表的实现(说白了其实就是链表结构体中有一个void * 类型指针即可)  今天在宣讲会上讲了一下我所写的那个可以接收任意类型的参数类型的链表,感觉还是没有讲清楚,再次整理...
  • C通用栈操作模块.zip

    2019-12-31 10:26:26
    C语言编写的任何类型数据通用操作模块,linux和windows通用。可以方便的添加到自己的工程中直接使用。同时提供了简易的调用例程
  • 借助与C语言中的void指针及函数指针,我们可以实现一个链式通用栈: /* stack.h */ #ifndef _STACK_H_ #define _STACK_H_ typedef struct stackNode { void *value; struct stackNode *next; } stackNode; ...
  • 通用栈(c实现)

    2017-07-12 15:32:35
    c语言实现的通用栈,可存放各种数据类型. cstack.h文件 #pragma once typedef struct Node { void *pdata; struct Node *pnext; }Node,*PNode; typedef struct CStack { int count; int data_...
  • 通用结点 typedef struct _node{//结点 int value; struct _node *next; }Node; 头结点和尾结点 typedef struct list{//链表 Node* head; Node* tail; }List; 基本链表 存入一连串整数遇到-1结束 #include #...
  • 可接受任意类型的数据的C语言链表  今天在宣讲会上讲了一下我所写的那个可以接收任意类型的参数类型的链表,感觉还是没有讲清楚,再次整理一下 ,同样的道理我们可以构造出其它的可以接受任意数据类型的结构,如...
  • 这篇 还是双端链表基础上实现,这里面只是在套组件,套写过的东西,就需要重新组合一下而已,也许以后在公司也就是这个样子,感觉C语言越来越强大了,还需要好好搞搞C语言,关于,不想多BB,感觉说啥概念没意思了...
  • 通用链表实现

    2015-04-15 19:02:15
    c语言 通过list_head单链表,实现
  • 这是在通用链表的基础上实现的椎,关于链表的实现参见:http://blog.csdn.net/swwlqw/article/details/22498833。 注意集合中只存储了指针,没有储存实际的数据。 对于新的数据类型来说,需要自定义HashCode函数...
  • 前面时间我讲了c语言的泛型结构和this指针实现,这次我写了几个常用的数据结构通用模板。 国内下载: https://gitee.com/xunanmu/c_language_template.git github下载: ...
  • 2017/3/12 33.1 formatter 通用输出格式 Python 3.6.1rc1文档 33.1formatter通用输出格式化 从版本3.4开始弃用 由于缺乏使用 格式化程序模块已被弃用 该模块支持两个接口定义 各具有多个实现 该格式化器接口 并且...
  • 后边借助老师之前的链表以及的实现,非递归实现二叉树的前序遍历、中序遍历、后续遍历、以及层次遍历-全部用实现。 目标实现如下二叉树,并且打印结果, /举例 /************************************  A...
  • 中缀表达式: 中缀表达式(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。 后缀表达式:
  • 通用数据类型的定义 不依赖于对象类型的代码,其中我们使用typedef来制定项的类型. typedef int Item; #define eq(A,B) (A == B) 二 接口的定义 接口中并不包含如何实现函数的信息,甚至也没有关于...
  • C语言精髓之编译过程视频教程

    千人学习 2016-01-28 10:48:44
    C语言是一门通用计算机编程语言,应用广泛,是计算机编程的语言,并且中国高校的理工科专业都必须学习C语言。该课程内容包括1、Linux操作系统的基本安装;2、通过hello world程序讲解C语言编辑、编译、执行过程;3、...
  • C语言函数库

    2013-03-15 15:40:08
    电子书籍,C/VC++教程,C++,参考手册 ...内容涵盖基本C/C++预处理命令、操作符优先级、转义字符、ASCII码表、基本数据类型、关键字,以及C++ 标准模板库(STL)通用类模板和算法集合...

空空如也

空空如也

1 2 3 4 5 6
收藏数 103
精华内容 41
关键字:

c语言通用栈

c语言 订阅