C 栈实现队列节点的管理
栈预先存储节点,队列的malloc/free均有栈模拟,从而保证不频繁的开辟/是否节点内存。
#include "com_is_buf.h"
#include "com_is_filter.h"
#include "assert.h" FileList_t* pgFileList = NULL;
FileList_t FileBuffer[IS_MAX_FILE_NUM];
static MS_U32* gs_pFileBufferSpace[IS_MAX_FILE_NUM];
Stack_t stack_file; #define ASSERT(x) assert(x) void create_stack(MS_U32 **ppStackSpace, MS_U32 nSize,
Stack_t* pStack)
{
ASSERT(ppStackSpace != NULL && pStack != NULL); pStack->m_pBuf = (void**)ppStackSpace; pStack->m_nBottom = ;
pStack->m_nTop = nSize-;
pStack->m_nInterator = ;
pStack->m_nSize = nSize;
} /**
* @brief pop stack
* @param pStack : stack to pop
* @return NULL
*/
void* pop_stack(Stack_t * pStack )
{
MS_U32 i = ;
void *pResult = NULL; ASSERT( pStack != NULL );
if( pStack->m_nInterator > )
{
i = (--pStack->m_nInterator) + pStack->m_nBottom; pResult = (void*)(pStack->m_pBuf[i]); return pResult;
} // no more stack to alloc
return NULL;
} /**
* @brief push data into stack
* @param pStack : stack to push
* @param pBuf : the pointer of data
* @return NULL
*/
void push_stack(Stack_t * pStack, void* pBuf )
{
MS_U32 i = ; ASSERT(pStack != NULL && pBuf != NULL); if( pStack->m_nInterator < pStack->m_nSize )
{
i = (pStack->m_nInterator++)+pStack->m_nBottom; pStack->m_pBuf[i] = pBuf;
}
} MS_U32 com_stack_file_initialize( void )
{
MS_U32 i = ;
MS_U32 err = ; create_stack(gs_pFileBufferSpace, IS_MAX_FILE_NUM, &stack_file); for( i=; i<IS_MAX_FILE_NUM; i++ )
{
push_stack( &stack_file, (void*)&FileBuffer[i] );
}
return err;
} FileList_t* com_is_malloc_file(void)
{
FileList_t* pFileList = NULL;
pFileList = (FileList_t*)pop_stack( &stack_file );
if( pFileList!=NULL )
{
memset( pFileList, , sizeof(FileList_t) );
} return pFileList;
} MS_U32 com_is_free_file( FileList_t *buf )
{
memset(buf,,sizeof(FileList_t));
push_stack( &stack_file, (void*) buf); FileList_t *pFileList = pgFileList;
FileList_t *pPreFileList = pgFileList; if(pgFileList == buf)
{
pgFileList = NULL;
buf = NULL;
return ;
} if( NULL != pFileList )
{
while( pFileList->next != NULL )
{
pPreFileList = pFileList;
pFileList= pFileList->next;
} if(pFileList == buf)
{
buf = NULL;
pPreFileList->next = NULL;
}
}
return ;
} void com_is_add_file( FileList_t** pFileOut)
{
FileList_t *pFileList = pgFileList;
FileList_t *pFileNew = NULL; pFileNew = com_is_malloc_file();
if(pFileNew == NULL)
{
return ;
}
pFileList = pgFileList;
if( NULL != pFileList )
{
while( pFileList->next != NULL )
{
pFileList= pFileList->next;
} pFileList->next = pFileNew;
pFileNew->next = NULL;
}
else
{
pFileNew->next = NULL;
pgFileList = pFileNew;
}
*pFileOut = pFileNew;
return ; } void com_is_destroy_filelist(void )
{
FileList_t *pFile = pgFileList;
FileList_t *pFile_temp = NULL; for(pFile = pgFileList;pFile != NULL; )
{
//com_is_free_file(pFile); pFile_temp = pFile->next;
memset(pFile,,sizeof(FileList_t));
push_stack( &stack_file, (void*) pFile);
pFile = pFile_temp;
}
pgFileList = NULL;
} FileState_t com_is_update_file_type(FileList_t *pFile)
{
MS_U16 len = ;
FileState_t state = FILE_OK;
len = strlen((char*)pFile->m_pchFileName);
if( == pFile->m_pchFileName[len-]//x
&& == pFile->m_pchFileName[len-]//m
&& == pFile->m_pchFileName[len-])//l
{
pFile->m_FileType = FILE_XML;
}
else if( == pFile->m_pchFileName[len-]//b
&& == pFile->m_pchFileName[len-]//m
&& == pFile->m_pchFileName[len-])//p
{
pFile->m_FileType = FILE_BMP;
}
else if( == pFile->m_pchFileName[len-]//m
&& == pFile->m_pchFileName[len-]//p
&& == pFile->m_pchFileName[len-])//g
{
pFile->m_FileType = FILE_MPG;
}
else
{
pFile->m_FileType = FILE_ERR;
state = FILE_ERROR;
}
return state;
} FileList_t* com_is_get_file_list(void)
{
return pgFileList;
}
#ifndef __COM_IS_BUF_H__
#define __COM_IS_BUF_H__
#include "MsCommon.h" #define IS_MAX_FILE_NAME (50)
#define IS_MAX_SECTION_NUM (700) // TODO: 2.5MB->640 Section
#define IS_MAX_SECTION_LEN (4100) // #define ADDR_ALIGN(data) ((((data) & 0x3) == 0)? (data) : ((data) + 0x4 - ((data) & 0x3))) typedef struct Stack_s
{
MS_U32 m_nBottom;
MS_U32 m_nTop;
MS_S32 m_nInterator;
MS_U32 m_nSize;
void** m_pBuf;
}Stack_t; typedef enum FileType_e
{
FILE_ALL,
FILE_BMP,
FILE_XML,
FILE_MPG,
FILE_ERR,
}FileType_t; typedef enum FileState_e
{
FILE_NOT_EXIST = ,
FILE_EXIST,
FILE_ERROR,
FILE_OK
}FileState_t; typedef struct FileList_s
{
FileType_t m_FileType;
MS_U16 m_FileId;
MS_U8 m_version;
MS_U8 m_chFileNameLen;
MS_S8 m_pchFileName[IS_MAX_FILE_NAME +];
MS_U8 m_nLastSection;
MS_U32 m_nFileAddr;
MS_U32 m_nFileLength;
MS_U32 m_nSubFileAddr[];
MS_U32 m_nSubFileLength[]; struct FileList_s *next;
}FileList_t; MS_U32 com_stack_file_initialize( void );
MS_U32 com_stack_file_free(void);
FileList_t* com_is_malloc_file(void);
MS_U32 com_is_free_file( FileList_t *buf );
void com_is_add_file( FileList_t** pFileOut);
void com_is_destroy_filelist(void );
FileState_t com_is_update_file_type(FileList_t *pFile); FileList_t* com_is_get_file_list(void); #endif
C 栈实现队列节点的管理的更多相关文章
- 什么是“堆”,"栈","堆栈","队列",它们的区别?
堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树. 将根节点最大的堆叫做最大堆 ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- 堆”,"栈","堆栈","队列"以及它们的区别
如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到, ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- 剑指offter-面试题7.用两个栈实现队列
题目.用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead 分别完成在对尾插入节点和在队头删除节点. 该队列类模板如下: template <typ ...
- 【Java实现】栈和队列就是这么简单
一.前言 上一篇已经讲过了链表[Java实现单向链表]了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并指正哦,如果有更好的理解的方式也希望能够 ...
- 剑指offer-面试题7:俩个栈实现队列(c)
- 课堂笔记及知识点----栈和队列(2018/10/24(am))
栈: Stack<int> xt=new Stack<int>() ; 先进后出,后进先出,水杯结构,顺序表类似 常用方法: .pop---->出栈,弹栈 ...
随机推荐
- caffe arm
依赖库: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-de ...
- 图论++【洛谷p1744】特价采购商品&&【一本通1342】最短路径问题
(虽然题面不是很一样,但是其实是一个题qwq) [传送门] 算法标签: 利用Floyed的o(n3)算法: (讲白了就是暴算qwq) 从任意一条单边路径开始.所有两点之间的距离是边的权,或者无穷大,如 ...
- HTTP安全通信:Https和SSL
1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HT ...
- python学习(八)
- MapServer Configuring with IIS
MapServer Configuring with IIS 一.前言 1.MapServer简介 MapServer是一个用C语言编写的开源地理数据呈现引擎.除了浏览地理信息系统数据之外,MapSe ...
- 认识jmeter
1.jmeter是什么:Apache Jmeter是Apache组织开发的基于java的压力测试工具. Jmeter可用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试他们的强度和分析整体 ...
- Java的基本数据类型大小及其包装类
Java的基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义 ...
- Js 基本类型和引用类型
一个变量可以存放两种类型的值,基本类型的值(primitive values)和引用类型的值(reference values). ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值. ...
- Oracle 导出的表不全,以及数据库版本不同导入报错
公司有两个环境下的数据库,版本不同,一个是11g r2,另一个是10g r2 首先在11g r2下用exp导出数据库备份文件,发现部分表缺失. 原来这部分表是空的,11G中新特性,当表无数据时,不分配 ...
- 1.5 pycharm使用
1.5 pycharm使用 前言 在写脚本之前,先要找个顺手的写脚本工具.python是一门解释性编程语言,所以一般把写python的工具叫解释器.写python脚本的工具很多,小编这里就不一一 ...