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---->出栈,弹栈 ...
随机推荐
- 以太坊钱包开发系列2 - 账号Keystore文件导入导出
以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...
- part4:素数判别
法一: √n判别 这个的话就是暴力了吧,不过只能判别单个数是不是质数,而且很大的话会爆 //没有代码qwq(不想写 法二:埃式筛法 O(nloglogn)判别 直接代码好不啦: ],n,num; ]; ...
- laravel orwhere的使用
- 『TensorFlow』函数查询列表_张量属性调整
数据类型转换Casting 操作 描述 tf.string_to_number(string_tensor, out_type=None, name=None) 字符串转为数字 tf.to_doubl ...
- vscode settings.json
// 快捷键设置 keyiing.json // 将键绑定放入此文件中以覆盖默认值 [ /* // 转换大写 { "key" : "ctrl+shift+u", ...
- Linux c读取任意大小文件的所有数据
代码如下,执行完之后被分配的动态内存的指针会保存到result中.由于是动态分配内存,读取内容不再使用之后注意用free 释放掉,如不明白,请多搜索以下动态内存分配的资料. #include < ...
- 垃圾收集器(GC)
堆分区:所有new的对象都会存放在堆中 > 新生代(Young Generation):存放生命周期短的对象,具体还分为Eden和Survivor两个区,其中Survivor分为Fro ...
- js读取本地图片并显示
抄自 http://blog.csdn.net/qiulei_21/article/details/52785191 js读取本地图片并显示 第一种方法比较好 版权声明:本文为博主原创文章,未经博主允 ...
- Reactor
Flux和Mono Flux和Mono是Reactor中的两个基本概念.Flux表示的是包含0到N个元素的异步序列.在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息,序列结束的消息和序列 ...
- ecmall 学习记录2
1.ecmall 自带的写入日志方法:do_log4php("函数名","类名",$param); $param是参数 在类里调用写入之日的方法 需要先加载 ...