C++使用stack实现四则运算

复制代码
#include<iostream>
#include<bits/stdc++.h>

using namespace std;

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 *    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
 struct TreeNode {
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
 };

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        // write code here
        stack<int> stackNum;
        stack<char> stackCh;
        int  flag = 0;//用来判断字符串中是否有连续数字  比如  12+2
        for(int i = 0;i < s.length();i++){
            char c = s[i];
            if(c >= '0' && c <= '9'){
                if(flag == 0)
                    stackNum.push(int(c - '0'));
                if(flag == 1){
                    int z = stackNum.top() * 10;
                    z = z + int(c - '0');
                    stackNum.pop();
                    stackNum.push(z);
                }
                flag = 1;
            }else{
                flag = 0;
                if(!stackCh.empty()){
                    char topCh = stackCh.top();
                    if(c == ')'){
                        //必须把所有括号中间的进行运算
                        while(topCh != '('){
                            int b = stackNum.top();
                            stackNum.pop();
                            int a = stackNum.top();
                            stackNum.pop();
                            stackCh.pop();
                            int z = doIt(a,b,topCh);
                            stackNum.push(z);
                            topCh = stackCh.top();
                        }
                        stackCh.pop();
                        continue;
                    }
                    if(c == '('){
                        stackCh.push(c);
                        continue;
                    }
                    //直接循环把前面所有优先级的计算,最特殊的就是遇到   )
                    while(topCh != '(' && !stackCh.empty() && compareF(topCh,c) == 1){
                        int b = stackNum.top();
                        stackNum.pop();
                        int a = stackNum.top();
                        stackNum.pop();
                        stackCh.pop();
                        int z = doIt(a,b,topCh);
                        stackNum.push(z);
                        //第一个优先级高的话会出问题
                        if(!stackCh.empty())
                            topCh = stackCh.top();
                    }
                    stackCh.push(c);
                }else{
                    stackCh.push(c);
                }
            }
        }
        int  b = stackNum.top();
        stackNum.pop();
        int a = stackNum.top();
        char topCh = stackCh.top();
        int z = doIt(a,b,topCh);
        return z;
        
    }
    int doIt(int a,int b,char c){
        int result = 0;
        switch(c){
            case '+':{
                result = a + b;
                break;
            }
            case '-':{
                result = a - b;
                break;
            } 
            case '*':{
                result = a * b;
                break;
            }
            case '/':{
                result = a / b;
                break;
            }
        }
        return result;
    }
    int compareF(char a,char b){
        int left,right;
        switch(a){
            case '+':{
                left = 1;
                break;
            }
            case '-':{
                left = 1;
                break;
            } 
            case '*':{
                left = 2;
                break;
            }
            case '/':{
                left = 2;
                break;
            }
        }
        switch(b){
            case '+':{
                right = 1;
                break;
            }
            case '-':{
                right = 1;
                break;
            } 
            case '*':{
                right = 2;
                break;
            }
            case '/':{
                right = 2;
                break;
            }
        }
        if(left>=right) return 1;
        else return -1;
    }
    
};
int main(){
    Solution so;
    string s1 = "1+2";
    string s2 = "(2*(3-4))*5";
    string s3 = "3+2*3*4-1";
    cout<<"   " <<so.solve(s1)<<endl;
    return 0;
}
复制代码

 

posted @   yizhixiaozhu  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-03-05 1500字博客
点击右上角即可分享
微信分享提示