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 ;
    }
    
  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/GC-hahaha/p/9457720.html
Copyright © 2011-2022 走看看