zoukankan      html  css  js  c++  java
  • c++ 计算器 带括号 代码实现

    我用了两个栈
    一个用来存数字 一个用来存运算符

    这里引入优先度的概念便于理解

    不同的运算符有不同的优先度
    当优先度高的符号进入栈中 所有比它优先度低的符号都要弹出
    对 就是这么霸道
    没有优先度 没有运算符能让它弹出 它也不能让别的运算符弹出 就是说运算过程中会被一直压在栈底
    */是 1
    +-的优先度都是 2
    最厉害的是 优先度为3 读到它的时候 栈的头指针要一直向下走 不断弹出运算符 直到碰到第一个为止
    因为右括号要赶去左括号身边保护它呀

    开始我也很懵的
    后来自己手动画了两个栈试了几组数据就搞明白了^^
    这里就举一个例子吧

    这里写图片描述

    这里写图片描述

    还有啊 我这个版本是非高精度的
    不过原理都一样
    不懂高精度处理的话 可以看我另一篇文章^^
    https://blog.csdn.net/qq_42887568/article/details/81435771

    include <bits/stdc++.h>
    using namespace std;
    char a[100] ;
    char fz[100] ; // 符号栈 
    int sz[100] ; // 数字栈 
    int fhead = 0 ; // 符号栈指针 
    int shead = 0 ; // 数字栈指针 
    
    void math(char f) // 从数字栈中取出栈顶的两个数字 进行 f 运算 结果继续放在栈中 
    {
        switch(f)
        {
            case '+' : sz[-- shead] += sz[shead + 1] ; break ;
            case '-' : sz[-- shead] -= sz[shead + 1] ; break ;
            case '*' : sz[-- shead] *= sz[shead + 1] ; break ;
            case '/' : sz[-- shead] /= sz[shead + 1] ; break ;
        }
        -- fhead ;  
        sz[shead + 1] = 0 ;
    }
    
    int main()
    {
        gets(a);
        int len = strlen(a)-1;
        for(int i = 0 ; i <= len ; ++ i )
        {   
            // 如果读到 "("  则直接放入栈中 
            if(a[i] == '(' ) { 
                    fz[++ fhead] = a[i] ;
                    continue ;
                }
            // 如果读到 ")"  则将 "(" 之前的运算符全部出栈 
            if(a[i]==')') { 
                    while(fz[fhead] != '(')
                    math(fz[fhead]) ;
                    -- fhead ;
                    continue ;
                }
            // 读到数字直接放在数字栈顶就ok啦 
            if(a[i] >= '0' && a[i] <= '9'){     
                ++ shead ;
                while(a[i] >= '0' && a[i] <= '9')
                    sz[shead] = sz[shead] *10 + a[i] - '0' ,i++;
                i--;
                continue;
                }
            else {
                if(a[i] == '/' || a[i] == '*'){ 
            // 如果读到 "/" 或 "*"  直接放在符号栈栈顶 
                        fz[++fhead] = a[i];
                        continue;
                    }
                else 
                    while(fz[fhead] == '*' || fz[fhead] == '/' || fz[fhead] == a[i]){ 
            // 如果读到 "+" 或 "-"  
            // 则将栈顶跟自己一样的符号和 "/"  "*" 全部弹出
            // 这个可以手动列几个式子体会一下 (^-^) 
                        math(fz[fhead]);
                        } 
                fz[++ fhead] = a[i] ;
                }
        }
        while(fhead != 0) {
            math(fz[fhead]) ;
            } 
        // 当栈中仅有一个数字的时候 运算式的答案就是它啦 
        cout << sz[shead] ; 
        return 0 ;
    }
    
  • 相关阅读:
    深拷贝的终极探索(90%的人都不知道)
    VS Code:让你工作效率翻倍的23个插件和23个编辑技巧
    Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
    【译】使用 ndb 调试 node 应用
    nodejs的express使用介绍
    Koa 框架教程
    VSCode配置Git随记
    单页面路由原理及实现
    可能比文档还详细--VueRouter完全指北
    急速JavaScript全栈教程
  • 原文地址:https://www.cnblogs.com/GC-hahaha/p/9457720.html
Copyright © 2011-2022 走看看