2017-06-27 19:19:18

第一步需要将中缀表达式转为后缀表达式。这步的转化可以说是本题的核心。

主要的转化手段是利用栈,有如下几个规则:

  • 数字直接输出
  • "("直接进栈
  • ")"将栈中元素出栈直到遇到"("
  • 其他运算符需要和栈顶元素比较优先级,如果栈顶元素的优先级小于等于待操作的运算符的,则需要出栈并输出。直到栈顶元素的优先级大于待处理元素
  • 最后需要将栈中元素清空,全部输出
int toint(string in)
{
int rst;
stringstream ss;
ss<<in;
ss>>rst;
return rst;
} int priority(char a)
{
switch(a)
{
case '*': return ;
case '/': return ;
case '+': return ;
case '-': return ;
case '(': return ;
case ')': return ;
}
} bool isdig(char a)
{
if(a>=''&&a<='') return true;
else return false;
} //保证每次入栈的符号的优先级都比当前的栈顶元素要高,若此时栈顶的优先级比入栈元素低或者等于的话,则需要出栈
//知道遇到比当前需要入栈元素优先级高的为止
void midtopost(string in,vector<string>& vec)
{
stack<char> s;
string rst="";
int i=;
while(true)
{
if(i>=in.length()) break;
if(isdig(in[i]))
{
string num="";
while(isdig(in[i])) num+=in[i++];
vec.push_back(num);
}
else
{
if(s.empty()) s.push(in[i++]);
else
{
if(in[i]=='(') {s.push(in[i]);}
else if(in[i]==')')
{
while(s.top()!='(')
{
string temp="";
temp+=s.top();
vec.push_back(temp);
s.pop();
}
s.pop();
}
else
{
if(priority(in[i])>priority(s.top())||s.top()=='(') s.push(in[i]);
else
{
//判断是否为空必须写在前面,符合短路原则
while(!s.empty()&&(priority(in[i])<=priority(s.top())))
{
string temp="";
temp+=s.top();
vec.push_back(temp);
s.pop();
}
s.push(in[i]);
}
}
++i;
} }
}
//清空栈
while(!s.empty())
{
string temp="";
temp+=s.top();
vec.push_back(temp);
s.pop();
}
} //后缀表达式的计算,数字进栈,符号将栈顶两个元素出栈,运算后进栈
int calc(vector<string>& vec)
{
stack<int> s;
for(int i=;i<vec.size();++i)
{
if(!vec[i].compare("*"))
{
int x=s.top();
s.pop();
int y=s.top();
s.pop();
s.push(x*y);
}
else if(!vec[i].compare("-"))
{
int x=s.top();
s.pop();
int y=s.top();
s.pop();
s.push(y-x);
}
else if(!vec[i].compare("+"))
{
int x=s.top();
s.pop();
int y=s.top();
s.pop();
s.push(x+y);
}
else if(!vec[i].compare("/"))
{
int x=s.top();
s.pop();
int y=s.top();
s.pop();
s.push(y/x);
}
else
{
s.push(toint(vec[i]));
}
}
return s.top();
} int main()
{
string in="9+(3-1)*3+10/2";
//string s="9 3 1 - 3 * + 10 2 / +";
vector<string> vec;
midtopost(in,vec);
cout<<calc(vec)<<endl;
return ;
}

C++ 利用栈解决运算问题的更多相关文章

  1. 【Java EE 学习 69 上】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】

    昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) public class UserAction ...

  2. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  3. python 利用栈实现复杂计算器

    #第五周的作业--多功能计算器#1.实现加减乘除及括号的优先级的解析,不能使用eval功能,print(eval(equation))#2.解析复杂的计算,与真实的计算器结果一致#用户输入 1 - 2 ...

  4. 利用闭包解决for循环里onclick事件不能捕捉实时i值问题

    问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...

  5. 用栈解决Largest Rectangle问题

    一问题描述 Given n non-negative integers representing the histogram's bar height where the width of each ...

  6. [Java]利用栈判断括号是否完整配对

    利用栈实现判断字符串中的括号是否都是配对的. 主要算法是依次读取字符串中的每一个字符,如果是左括号则将左括号压入栈中,如果是右括号则从栈中弹出最上面的字符,若两者不是同种括号或栈内已经没有字符就返回f ...

  7. 利用Readability解决网页正文提取问题

    分享: 利用Readability解决网页正文提取问题   做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以用SS为各种网站写脚本做解析, 但是 ...

  8. 利用gulp解决微信浏览器缓存问题

    做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...

  9. hdu 3666(差分约束,手动栈解决超时问题)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

随机推荐

  1. mysql进程文件

  2. EditPlus 4.3.2583 中文版已经发布

    新的版本提升了括号匹配的性能.请点击页面左上角连接下载.

  3. Linux命令: 查找文件中的字符串

    ①cat filename | grep 'string' ②编辑模式查找,/string, 依次敲入下面的命令 vim filename e i ESC /string 从光标位置开始往后查找第一个 ...

  4. Web API设计方法论--比较完整的web api 开发过程

    为Web设计.实现和维护API不仅仅是一项挑战:对很多公司来说,这是一项势在必行的任务.本系列将带领读者走过一段旅程,从为API确定业务用例到设计方法论,解决实现难题,并从长远的角度看待在Web上维护 ...

  5. NetSuite助力各行业企业快速发展

    Oracle NetSuite今天发布了一系列全新技术创新,帮助各行各业企业提升收入.海外扩张以及赋能更多业务用户.最新推出的商务管理.财务管理和分析能力可协助企业利用NetSuite平台来超越客户预 ...

  6. iOS原生的AVFoundation扫描二维码/条形码

    #import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVCaptureMetadataOutputO ...

  7. pollard_rho 学习总结 Miller_Rabbin 复习总结

    吐槽一下名字,泼辣的肉..OwO 我们知道分解出一个整数的所有质因子是O(sqrt(n)/ln(n))的 但是当n=10^18的时候就显得非常无力的 这个算法可以在大概O(n^(1/4))的时间复杂度 ...

  8. JAVA注解@Interface基础知识

    java注解是在JDK5时引入的新特性,大多数框架(SpringBoot.MyBatis.Quartz)背后都在大量使用注解开发. 一.先进行一个小试验,了解注解开发流程 建立maven项目annot ...

  9. 解决国内 NPM 安装依赖速度慢问题

    不知道各位是否遇到这种情况,使用NPM(Node.js包管理工具)安装依赖时速度特别慢,为了安装Express,执行命令后两个多小时都没安装成功,最后只能取消安装,笔者20M带宽,应该不是我网络的原因 ...

  10. STM32.定时器

    一.定时器分类 11个定时器: 定时器: 1.8  高级(7路PWM输出) 2.3.4.5 通用(4路) 6.7    基本 2个看门狗 1个sysTick 时钟分布: 二.这里我们主要对定时器中 定 ...