实现一个数字电路的脚本解释器(二)——数据栈的实现

在之前的分析中得出了一个大致的模型,可以看出数据栈是基本的部分
之前的分析有点无聊了,写点代码活动筋骨,这次的目的是完成一个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()

一个数据栈大致就这样实现了,之后如果有改动再补充

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值