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. yii2之创建管理员

    第一步,使用迁移文件建表admin 先建立数据迁移文件: 小贴士,如果发现自己改错了,需要重新修改迁移文件 第二步,使用gii工具创建model 创建一个新的model,继承AdminAR,方便以后管 ...

  2. linux安装composer及安装yii2

    wget https://getcomposer.org/download/1.3.2/composer.phar mv composer.phar /usr/local/bin/composer c ...

  3. 用rewrite把旧域名直接跳转到新域名的nginx配置

    用rewrite把旧域名直接跳转到新域名的nginx配置 把下面代码保存到daziran.com.conf 放在nginx配置目录下 /etc/nginx/conf.d/ #把旧域名zdz8207直接 ...

  4. 5+App使用定位

    1.定位方法     5+App定位方法:5+ API中的Geolocation模块     Geolocation目前支持h5内置的定位,百度,高德.h5内置定位支持wgs84坐标系:百度支持gcj ...

  5. Android LCD(二):LCD常用接口原理篇(转)

    源: Android LCD(二):LCD常用接口原理篇

  6. MySQL之表连接(内外连接和重命名的使用)

    #要多练练 1.连接查询根据连接方式分为 内连接 等值连接 非等值连接 自连接 外连接 左外连接(左连接) 右外连接(右连接) 当多张表进行连接查询,若没有任何条件进行限制,会 发生什么现象? 会出现 ...

  7. bzoj 1497 最大获利 - 最小割

    新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研 ...

  8. visual studio扩展插件Visual Assist x给代码插入注释模板(转载)

    转载:http://www.cnblogs.com/xiongmao-cpp/p/5196555.html Visual Assist 是由Whole Tomato公司为Microsoft Visua ...

  9. 通过例子来理解python闭包。

    闭包:就是内部函数对enclosing作用域的变量进行引用.(可先参考python函数作用域LEGB) 通过一个例子体会 def func_150(val): passline = 90 if val ...

  10. Linux多线程--使用信号量同步线程【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10813469 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过 ...