一个简单的动态堆栈的实现

//dstack.h

#define DSTACK void*
#define ITEM int

DSTACK createDStack(int initSize,int growSize);
bool releaseDStack(DSTACK stack);
void pushStack(DSTACK stack,ITEM item);
ITEM popStack(DSTACK stack);

//dstack.cpp


#include "stdafx.h"
#include <windows.h>
#include "DSTACK.H"
#include <stdlib.h>


typedef struct
{
 int * esp;
 int * bottom;
 int * top;
 int  currSize;
 int growSize;
 int currOffset;
 CRITICAL_SECTION cs;
}DStack;

typedef struct
{
 DStack * ref;
}DStackRef;

void _expandStack(DStackRef* stackref )
{
 DStack * stack = stackref->ref;
    DStack * newstack = new DStack();
 newstack->bottom = (int*)malloc((stack->currSize + stack->growSize)* 4 );
 newstack->currSize = stack->currSize + stack->growSize;
 newstack->top = (int*)newstack->bottom + newstack->currSize;
 newstack->growSize = stack->growSize;

 memcpy(newstack->bottom,stack->bottom,stack->currSize*4);
 newstack->esp = newstack->bottom +  (stack->esp - stack->bottom);

 free(stack->bottom);
 stackref->ref = newstack;
 
}
DSTACK createDStack(int initSize,int growSize)
{
    DStackRef * stackref = new DStackRef();
 DStack * stack = new DStack();
 stack->bottom = (int*)malloc(initSize * 4 );
 stack->currSize = initSize;
 stack->growSize = growSize;
 stack->esp = stack->bottom ;
 stack->top = (int*)stack->bottom + initSize;
 stack->currOffset = 0;
 stackref->ref = stack; 
 return (DSTACK)(stackref);

}

bool releaseDStack(DSTACK stack)
{
 DStackRef * stackref = (DStackRef *)stack;
 DStack * stk = stackref->ref;
 free(stk->bottom);
 delete stk;
 delete stackref;
 return true;
}

void pushStack(DSTACK stack,ITEM item)
{
    DStackRef * stackref = (DStackRef *)stack;
 DStack * stk = stackref->ref;
 if(stk->esp==stk->top )
 {
  _expandStack(stackref);
  stk = stackref->ref;
 }
 
 *(stk->esp) = (int)item; 
 stk->esp++;
 stk->currOffset++;
 
}
ITEM popStack(DSTACK stack)
{
 DStackRef * stackref = (DStackRef *)stack;
 DStack * stk = stackref->ref;
 if(stk->esp==stk->bottom)
  return NULL;
 stk->esp--;
 stk->currOffset--;
 int value = *(stk->esp); 
 return ITEM(value);
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值