tmstack.h

来自「1.小型编译器 2。支持整数」· C头文件 代码 · 共 135 行

H
135
字号
#ifndef _TM_STACK_H
#define _TM_STACK_H

#include "Globals.h"

class NoMem{
public:
	NoMem(){printf("NoMem\n");};
};

class OutOfBounds{
public:
	OutOfBounds(){printf("OutOfBounds\n");};
};

class TmStack{
public:
	TmStack(int MaxTmStackSize = 1024);
	~TmStack () {}
	
	bool 	IsEmpty() const {return m_nTop == 0; }
	bool 	IsFull() const {return m_nTop == m_nMaxTop ; }
	
	int 	Top() const;
	double 	TopD() const;
	
	void 	Push(const int x);
	void 	PushC(const char x);
	void 	PushD(const double x);
	
	int 	Pop();
	double 	PopD();
	char	PopC();
	
private :
	int 	m_nTop;     // 栈顶
	int 	m_nMaxTop;  // 最大的栈顶值
	BYTE 	m_sStack[DADDR_SIZE];
} ;

TmStack::TmStack(int MaxTmStackSize)
{
	m_nMaxTop = MaxTmStackSize;
	m_nTop = 0;
}

int TmStack::Top() const
{	
	static int x;
	// 返回栈顶元素
	if (IsEmpty()) 
		throw OutOfBounds();
	else {
		memcpy(&x, &m_sStack[m_nTop-4],sizeofint);
		return x;
	}
}

double TmStack::TopD() const
{	
	static double x;
	// 返回栈顶元素
	if (IsEmpty()) 
		throw OutOfBounds();
	else {
		memcpy(&x, &m_sStack[m_nTop-8],sizeofdouble);
		return x;
	}
}

void TmStack::Push(const int x)
{ 
	//添加元素x
	if (IsFull()) 
		throw NoMem();
	memcpy(&m_sStack[m_nTop], &x, sizeofint);
	m_nTop += 4;
	return ;
}

void TmStack::PushD(const double x)
{ 
	//添加元素x
	if (IsFull()) 
		throw NoMem();
	memcpy(&m_sStack[m_nTop], &x, sizeofdouble);
	m_nTop += 8;
	return ;
}

void TmStack::PushC(const char x)
{ 
	//添加元素x
	if (IsFull()) 
		throw NoMem();
	memcpy(&m_sStack[m_nTop], &x, sizeofchar);
	m_nTop += 1;
	return ;
}

int TmStack::Pop()
{
	static int x;
	// 删除栈顶元素,并将其送入x
	if (IsEmpty())  
		throw OutOfBounds();
	m_nTop -= 4;
	memcpy(&x, &m_sStack[m_nTop], sizeofint);
	return x;
}

double TmStack::PopD()
{
	static double x;
	// 删除栈顶元素,并将其送入x
	if (IsEmpty())  
		throw OutOfBounds();
	m_nTop -= 8;
	memcpy(&x, &m_sStack[m_nTop], sizeofdouble);
	return x;
}

char TmStack::PopC()
{
	static char x;
	// 删除栈顶元素,并将其送入x
	if (IsEmpty())  
		throw OutOfBounds();
	m_nTop -= 1;
	memcpy(&x, &m_sStack[m_nTop], sizeofchar);
	return x;
}

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?