当前位置:编程学习 > C/C++ >>

逆波兰式实现四则运算表达式计算器支持括号、十六进制

[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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,