在之前的分析中得出了一个大致的模型,可以看出数据栈是基本的部分
之前的分析有点无聊了,写点代码活动筋骨,这次的目的是完成一个FILO数据栈。
这里很容易看出来是怎么实现的,也可以用其他的方式实现这个数据栈,只要对外的POP和PUSH接口一样
一个数据栈大致就这样实现了,之后如果有改动再补充
之前的分析有点无聊了,写点代码活动筋骨,这次的目的是完成一个FILO数据栈。
留下POP和PUSH接口
创建一个DataStack.h,内容如下
#ifndef DATASTACK_H
#define DATASTACK_H
#include "../public/ErrorDefine.h"
//堆栈是使用链表实现的,每添加一个元素都会将该元素链接到开头,并将StackPointer修改为最新的元素的指针
class StackElement{
public:
int Value;
StackElement *Next; <span style="white-space:pre"> </span> //指向下一个元素
private:
};
class DataStack{
public:
DataStack(){FirstElement=0;};
int POP(); //出栈
int PUSH(int _PushData); <span style="white-space:pre"> </span>//压栈
private:
StackElement *FirstElement; //堆栈第一个元素的地址
};
#endif
创建一个DataStack.cpp,内容如下:
#include "DataStack.h"
int DataStack::POP(){ //出栈
if(0==FirstElement){
throw ERROR_DATASTACKEMPTY; //堆栈为空
}
StackElement *_FirstElement=FirstElement->Next;
int _ElementValue;
_ElementValue=FirstElement->Value;
try{
delete FirstElement; //释放第一个元素的空间
}
catch(int ErrorID){
throw ERROR_DELETE; //释放失败,抛出错误
return ERROR_DELETE;
}
FirstElement=_FirstElement; //重新指向出栈后的第一个元素
return _ElementValue;
}
int DataStack::PUSH(int _PushData){ //压栈
StackElement *_FirstElement=FirstElement;
try{ //捕获异常
FirstElement=new StackElement; //创建第一个元素
}
catch(int ErrorID){
return ERROR_NEW; //分配失败,返回错误
}
FirstElement->Next=_FirstElement; //将新元素的Next指向第二个元素
FirstElement->Value=_PushData;
return 0;
}
这里很容易看出来是怎么实现的,也可以用其他的方式实现这个数据栈,只要对外的POP和PUSH接口一样
需要补充的一点是代码中用到了大量的 ERROR_* ,这个是为了调试方便定义的错误号,等到以后发生错误就能很快的通过错误号找到错误原因
错误定义在文件 public/ErrorDefine.h中
这里截取DataStack的错误定义:
//内存分配错误
#define ERROR_NEW 100 //FileStreamList.AddFileStream()
//FunctionList.AddFunction()
//SymbolList.AddSymbol()
//DataStack.PUSH()
//CodeStack.PUSH()
//内存删除错误
#define ERROR_DELETE 101 //FunctionList.~FunctionList()
//SymbolList.~SymbolList()
//DataStack.POP() 注意是throw抛出错误
//CodeStack.POP() 这个是返回错误,不是抛出
//DataStack下的错误定义()
//数据堆栈为空
#define ERROR_DATASTACKEMPTY 500//DataStack.POP()
一个数据栈大致就这样实现了,之后如果有改动再补充