⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.cpp

📁 此程序可实现一定的计算器功能
💻 CPP
字号:
#include<iostream.h>

enum type{NUM,ADD,SUB,MUL};
class elem
{
public:
	type elemType;
	int number;
	elem * left;
	elem * right;
	elem();
	elem(char t);
	elem(int num);
	void print();
};
elem::elem()
{
	number = 0;
	left = NULL;
	right = NULL;
}
elem::elem(char t)
{
	if(t == '+')
		elemType = ADD;
	if(t == '-')
		elemType = SUB;
	if(t == '*')
		elemType = MUL;
	number = 0;
	left = NULL;
	right = NULL;
}
elem::elem(int num)
{
	elemType = NUM;
	number = num;
	left = NULL;
	right = NULL;
}
void elem::print()
{
	
	if(elemType == NUM)
	{
		cout<<"节点类型为NUM, 数字为"<<number<<endl;
	}
	if(elemType == ADD)
	{
		cout<<"节点类型为ADD"<<endl;
	}
	if(elemType == SUB)
	{
		cout<<"节点类型为SUB"<<endl;
	}
	if(elemType == MUL)
	{
		cout<<"节点类型为MUL"<<endl;
	}
}

//Tree函数将运算式作为一个字符串作为输入,构造出运算式的结构树
elem Tree(char * list)                     
{
	int i = 0;
	int k = 0;
	int length;
	int num = 0;

//得到字符串长度
	while(*(list + i)!= '\0')
	{
		i++;
	}
	length = i;

//处理+ - 优先级
	while(i >= 0)       
	{
		if(*(list + i)==')')
			k++;
		else if(*(list + i)=='(')
			k--;
		else if((k == 0)&&((*(list + i) == '+')||(*(list + i) == '-')))
		{	
			elem t(*(list + i));
			char * list1 = new char[i + 1];
			for(int j = 0;j < i;j++)
				*(list1 + j) = * (list + j);
			*(list1 + i) = '\0';
			char * list2 = list + i + 1;
			t.left = new elem();
			*(t.left) = Tree(list1);
			t.right = new elem();
			*(t.right) = Tree(list2);

			t.print();

			return t;
		}
		i--;
	}

	i = 0;

//处理 * 运算
	while(*(list + i) != '\0')
	{
		if(*(list + i)=='(')
			k++;
		else if(*(list + i)==')')
			k--;
		else if((k == 0)&&(*(list + i)=='*'))
		{
			elem t(*(list + i));
			char * list1 = new char[i + 1];
			for(int j = 0;j < i;j++)
				*(list1 + j) = * (list + j);
			*(list1 + i) = '\0';
			char * list2 = list + i + 1;
			t.left = new elem();
			*(t.left) = Tree(list1);
			t.right = new elem();
			*(t.right) = Tree(list2);

			t.print();

			return t;
		}
		i++;	
	}

	i = 0;

//处理()内的运算
	if((*(list + i) == '(') && (*(list + length - 1) == ')'))
	{
		char * list1 = new char[length - 1];
		for(int j = 0;j < length-2;j++)
			*(list1 + j) = *(list + j + 1);
		*(list1 + length - 2) = '\0';
		elem t = Tree(list1);

		t.print();

		return t;
	}

//处理纯数字
	while(*(list + i) != '\0')
	{
		num = num * 10;
		num = num - 48;
		num = num + int(*(list + i));
		i++;
	}
	elem t(num);

	t.print();

	return t;
}

//根据算式的结构树,运算出结果
int Calculate(elem t)
{
	int t1;
	int t2;
	int t0;
	if(t.left != NULL)
		t1 = Calculate(*(t.left));
	if(t.right != NULL)
		t2 = Calculate(*(t.right));
	if(t.elemType == NUM)
		t0 = t.number;
	else if(t.elemType == ADD)
		t0 = t1 + t2;
	else if(t.elemType == SUB)
		t0 = t1 - t2;
	else if(t.elemType == MUL)
		t0 = t1 * t2;
	return t0;
}

//输出算式中的数字
void getNum(elem t)
{
	if(t.elemType == NUM)
	{
		cout<<"NUM : "<<t.number<<endl;
		return ;
	}
	if(t.left != NULL)
		getNum(*(t.left));
	if(t.right != NULL)
		getNum(*(t.right));
}
int main()
{
	char * a = "10-2*3";
	elem b = Tree(a);
	int i = Calculate(b);
	cout<<a<<" ="<<i<<endl;

	cout<<endl;

	char * a0 = "(1+2+3)*2";
	elem b0 = Tree(a0);
	i = Calculate(b0);
	cout<<a0<<" ="<<i<<endl;

	cout<<endl;

	cout<<"输出算式中的数字:"<<endl;
	getNum(b);
	return 0;
}

⌨️ 快捷键说明

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