📄 calculator.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 + -