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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-03-05 1500字博客