逆波兰式实现四则运算表达式计算器支持括号、十六进制
[cpp]
最近做一个题目,要求实现简单的四则运算、支持括号和十六进制、浮点数等。同时能够进行输入合法检查。
最近做一个题目,要求实现简单的四则运算、支持括号和十六进制、浮点数等。同时能够进行输入合法检查。 用逆波兰式(后缀表达式)实现时主要包括以下几个主要部分:
栈操作:包括入栈、出栈、是否为空、栈顶元素等,由于在栈操作中需要char型和float型,需要创建模板。
输入合法检查:包括输入合法字符、输入括号匹配、输入括号匹配、输入正确的十六进制、运算符无或连续。
提取输入表达式:由于输入的表达式中有浮点数或者十六进制数需要提取出来。
中缀表达式转化为后缀表达式:输入的表达式为中缀表达如a+b*c+(d*e+f)*g,需要将该表达式转化为后缀表达式即abc*+de*f+g*+。
计算后缀表达式:从而得到计算结果
计算结果输出处理:包括判断是否为有十六进制,对含有十六进制表达式的输出结果需要分析是否需要输出十六进制、输出结果是否为整数等
分别分析如下:
由于输入的表达式中有数字、字符等,在后来的栈操作时需要的不仅是char型的,还需要float型(int型数字也可以用float处理)。所以栈操作如下:定义栈模板。并实现具体操作:
[cpp]
//自定义一个栈模板
template <class T>
class stack
{
public:
stack(){top = -1;}
T topElem();
T pop();
bool isEmpty();
void push(T _elem);
private:
T elem[g_iconstArrayMax];
int top;
};
//入栈
template <class T>
void stack<T>::push(T _elem)
{
if (top == g_iconstArrayMax - 1)
{
printf("栈满!\n");
}
else
{
top++;
elem[top] = _elem;
}
}
//出栈
template <class T>
T stack<T>::pop()
{
if (top == -1)
{
printf("栈空!\n");
return 0;
}
else
{
T x = elem[top--];
return x;
}
}
//返回栈顶元素
template <class T>
T stack<T>::topElem()
{
if (top == -1)
{
printf("栈空!\n");
return 0;
}
else
{
return elem[top];
}
}
//是否为空
template <class T>
bool stack<T>::isEmpty()
{
if (top == -1)
{
return true;
}
else
{
return false;
}
}
//自定义一个栈模板
template <class T>
class stack
{
public:
stack(){top = -1;}
T topElem();
T pop();
bool isEmpty();
void push(T _elem);
private:
T elem[g_iconstArrayMax];
int top;
};
//入栈
template <class T>
void stack<T>::push(T _elem)
{
if (top == g_iconstArrayMax - 1)
{
printf("栈满!\n");
}
else
{
top++;
elem[top] = _elem;
}
}
//出栈
template <class T>
T stack<T>::pop()
{
if (top == -1)
{
printf("栈空!\n");
return 0;
}
else
{
T x = elem[top--];
return x;
}
}
//返回栈顶元素
template <class T>
T stack<T>::topElem()
{
if (top == -1)
{
printf("栈空!\n");
return 0;
}
else
{
return elem[top];
}
}
//是否为空
template <class T>
bool stack<T>::isEmpty()
{
if (top == -1)
{
return true;
}
else
{
return false;
}
}
在对输入的表达式进行分析,由于输入的表达式中有可能哟float、十六进制,整数,于是需要对输入的表达式进行分析,将操作数和操作符分别提取出来。并在提取的同时将char型型计算出float int和十六进制数字,并将十六进制数字转化为int方便后来的计算。
该功能由函数实现如下,在该函数中分别将数字存储在figure中,并将操作数用figure中的下标+1代替,结合操作符将,原表达式如1.23+0x23*2+(1.5*3-0.5)*2转化为仅包含int型下标和操作符如1+2*3+(4*5-6)*7的存储于dest中:
[cpp]
//把数字都拆出来,然后放进figure数组中,将原字符串复制到dest中,
//同时,数字全部用figure中对应的小标代替
void cToFig(char* dest,char* str,float* figure)
{
if (NULL == str)
{
printf("字符串为空!\n");
}
else
{
int j = 0;
int figNum= 0;//figure下标
int powNum = 1;//pow的次数
int destNum = 0;//dest的下标
int i = 0;
while(str[i]!='\0')
{
if (str[i] >= '0' && str[i] <= '9')
{
j = i+1;
&nbs
补充:软件开发 , C++ ,