算法~简单的计算器(验证数学表达式是否合法~“状态机思想”)

简介: 算法~简单的计算器(验证数学表达式是否合法~“状态机思想”)

算法~简单的计算器(验证数学表达式是否合法~“状态机思想”)

(有限状态机思想~进行状态转化,每个状态下,再进行判断是否转化状态)

1,为什么存储结构选择~栈?

因为栈可以去除括号,处理优先级~

举例:14-(5-6)

83.png

2,计算思路:

(1)全局变量compute_flag 标志是否可以进行计算,初始comute_flag = 0; 遇到 “+”或者“-”时,compute_flag = 1;

遇到“(”,compute_flag = 0;

(2)字符串数处理为整型数:number = number * 10 + ch - ‘0’;

【ps举例:String s="1234"; for(int i = 0; i < s.length(); i++){ number = number*10+s[i]-'0'; }】~‘ascall 码 相减(- ‘0’)获取该值 ’。

(3)状态机过程:循环遍历所有字符串元素:判断第一个字符串元素是否为空,空~continue;非空,进入startState~

stateState:若是(“0”~“9”)~进入numberState 状态;若是“(” 进入operationState状态。

然后,“退格”【因为循环体内部最后一行代码是 i++,退格回到s[i] 本身,进入numState 状态/opState状态。】

(全局变量:state、startState、numberState、opState)

(4) numberState 状态:

    如果遇到(“0”~“9”){//处理转化为整型数:number = number*10+s[i]-'0';   },否则 {

1,先将数number 压入数字栈number_stack;  [字符串元素 1 2 3  +  遇到 + ,才知道前三个元素构成一个数字]

2, 判断compute_state 是否为1,为1,则进行计算;

3,num=0;进入操作符状态operationState~遇到 +】,退格 i--;}

(5) operationState状态:{

1,判断是“+” 或“-”,压入操作符栈operation_stack; 修改compute_flag = 1;

2,如果 遇到 "(", 修改compute_flag = 0; 进入数字状态 numberState~

3,如果遇到(“0”~“9”),进入数字状态 numberState,退格i --; ~

4,如果 遇到 ")", 直接进行计算

}

(6)最后一个数number的处理【为什么有最后一个数 ,因为 之前的字符串元素 1 2 3  +  遇到 + ,才知道前三个元素构成一个数字将数压栈,

但是最后一个数是因为遍历结束,并非有 “+”的提示】:

如果number != 0,则 压入数字栈number_stack,然后进行计算;

如果number == 0 且 栈空了,结果就是 0;

 

3,代码:

❀ 计算方法:

/**
 * 计算
*/
void compute(std::stack<int> &number stack, std:: stack<char> &operation_stack){
    if(number_state.size() < 2){
        return;
    } 
    int num2 = number_state.top();
    number_state.pop();
    int num1 = number_state.top();
    number_state.pop();
    if(operation_stack.top() == '+'){
        number_state.push(num1 + num2);
    }else if(operation_stack.top() == '-'){
        number_state.push(num1 - num2);
    }
    operation_stack.pop();
}

❀ “状态机”过程的计算方法:

 

int calculate(std::String s){
    static const int START_STATE = 0;
    static const int NUMBER_STATE = 1;
    statci const int OPERATION_STATE = 2;
    std::stack<int> number_stack;
    std::stack<char> operation_stack;
    int number = 0;       //用于将字符串数处理为整型数
    int STATE = START_STATE;
    int compute_flag = 0;  //全局变量compute_flag 标志是否可以进行计算
    for(int i = 0; i < s.length(); i++){
        if(s[i] == '') continue;
        switch (STATE){
            case START_STATE:
                if(s[i] >= '0' && s[i] <= '9'){
                    STATE = NUMBER_STATE;
                }else {
                    STATE = OPERATION_STATE;
                }
                i--;    //退格,因为循环体内部最后一行代码是 i++,退格回到s[i] 本身
                break;
            case NUMBER_STATE:
                if(s[i] >= '0' && s[i] <= '9'){
                    number = number * 10 + s[i] - '0';
                }else{
                    number_stack(number);
                    if(compute_flag == 1){
                        compute(number_stack,operation_stack);
                    }
                    number = 0;
                    STATE = OPERATION_STATE;
                    i--;   //退格
                }
                break;
            case OPERATION_STATE:
                if(s[i] == '+' || s[i] == '-'){
                    operation_stack.push(s[i]);
                    compute_flag = 1;
                }else if(s[i] == '('){
                    STATE = NUMBER_STATE;
                    compute_flag = 0;
                }else if(s[i] >= '0' && s[i] <= '9'){
                    STATE = NUMBER_STATE;
                    i--;
                }else if(s[i] == ')'){
                    compute(number_stack,operation_stack);
                }
                break;
        }
    }
    //最后遍历凑成的一个数
    if(number != 0){
        number_stack.push(number);
        compute(number_stack,operation_stack);
    }else if(number == 0 && number_stack.empty()){
        return 0;
    }
    return number_stack.top();
}

 

 

 

 

 

目录
相关文章
|
6月前
|
存储 安全 算法
|
6月前
|
人工智能 算法 测试技术
【数学】【排序】【C++算法】3027人员站位的方案数
【数学】【排序】【C++算法】3027人员站位的方案数
|
6月前
|
存储 算法 Serverless
【C/C++ 数据结构】深入探索数据结构中算法复杂度:从C++和数学的视角
【C/C++ 数据结构】深入探索数据结构中算法复杂度:从C++和数学的视角
75 0
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
28 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
27天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
37 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
3月前
|
算法 C++
第一周算法设计与分析 F : 模拟计算器
该文章 "第一周算法设计与分析 F : 模拟计算器" 的摘要或讨论。这篇文章介绍了如何设计一个程序来模拟一个基本的计算器,处理包含加、减、乘运算的表达式,并给出了相应的C++代码实现
|
5月前
|
算法 Java Go
斐波那契数列是一个非常经典的数学问题,在计算机科学中也经常被用作算法设计和分析的例子。
斐波那契数列是一个非常经典的数学问题,在计算机科学中也经常被用作算法设计和分析的例子。
|
4月前
|
算法 安全 网络安全
支付系统,网络安全06----支付安全---,机密性,加密算法,目前最流行的加密算法,AES加密算法,目前最流行的非对称加密算法RSA,对称加密和非对称加密的优缺点,非对称加密是基于非常复杂的数学算法
支付系统,网络安全06----支付安全---,机密性,加密算法,目前最流行的加密算法,AES加密算法,目前最流行的非对称加密算法RSA,对称加密和非对称加密的优缺点,非对称加密是基于非常复杂的数学算法
|
5月前
|
存储 算法 数据可视化
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
python多种算法对比图解实现 验证二叉树搜索树【力扣98】