4:中缀表达式的值
来源:互联网 发布:三门峡算法工程师招聘 编辑:程序博客网 时间:2024/06/06 01:57
- 总时间限制:
- 200ms
- 内存限制:
- 1024kB
- 描述
- 人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。
给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。 - 输入
- 第一行为测试数据的组数N
接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。 - 输出
- 对每一组测试数据输出一行,为表达式的值
- 样例输入
33+5*8(3+5)*8(23+34*45/(5+6+7))
- 样例输出
4364108
- 提示
- 注意:运算过程均为整数运算(除法运算'/'即按照C++定义的int除以int的结果,测试数据不会出现除数为0的情况),输出结果也为整数(可能为负)。
中间计算结果可能为负。
100多行的代码。未能过此题,始终觉得是个遗憾。。
第一次写表达式求值
要先设置一个运算符的栈,从左只有扫描中缀表达式(百度的哦)
1、如果遇到数字,直接放到后缀表达式尾;
2、如果遇到遇到运算符
a:若此时栈空,则直接入栈;
b:循环:若栈st不空且栈顶运算符的优先级大于等于当前的运算符,则栈顶运算符出栈,置于后缀表达式尾;
c:若栈不空且栈顶运算符的优先级小于当前的运算符,则将此运算符直接入栈;
反复执行1,2,直到整个中缀表达式扫描完毕,若此时栈不空,则将栈顶的运算符依次出栈,依次置于后缀表达式尾。下面是错误代码。求指正。。
100多行不容易看。。。
#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<assert.h>#include<ctype.h>#include<stack>using namespace std;int main(){ int N; scanf("%d%*c",&N); while(N--) { char a[1001],b[1001]; gets(a); stack<char> hou; stack<int> ji; int i,h=0; int len=strlen(a); for(i=0; i<len; i++) { if(isalnum(a[i])) { while(isalnum(a[i])&&i<len) { b[h++]=a[i++]; } b[h++]='!'; } if(a[i]=='(')hou.push(a[i]); if(a[i]=='*'||a[i]=='/'){ while(!hou.empty()&&hou.top()!='('&&(hou.top()=='*'||hou.top()=='/')){ b[h++]=hou.top(); hou.pop(); } hou.push(a[i]); } if(a[i]=='+'||a[i]=='-') { while(!hou.empty()&&hou.top()!='('&&(hou.top()=='*'||hou.top()=='/'||hou.top()=='+'||hou.top()=='-')) { b[h++]=hou.top(); hou.pop(); } hou.push(a[i]); } if(a[i]==')') { while(!hou.empty()&&hou.top()!='(') { b[h++]=hou.top(); hou.pop(); } hou.pop(); } } while(!hou.empty()) { b[h++]=hou.top(); hou.pop(); } int T[100]= {0}, G=0; int a1,a2; int ans; for(i=0; i<h; i++) { if(isalnum(b[i])) { while(b[i]!='!'&&i<h) { T[G]=T[G]*10+(b[i]-'0'); i++; } if(b[i]=='!') { ji.push(T[G]); G++; } } if(b[i]=='+') { if(!ji.empty()) { a1=ji.top(); ji.pop(); } if(!ji.empty()) { a2=ji.top(); ji.pop(); } ans=a1+a2; ji.push(ans); } if(b[i]=='*') { if(!ji.empty()) { a1=ji.top(); ji.pop(); } if(!ji.empty()) { a2=ji.top(); ji.pop(); } ans=a1*a2; ji.push(ans); } if(b[i]=='-') { if(!ji.empty()) { a1=ji.top(); ji.pop(); } if(!ji.empty()) { a2=ji.top(); ji.pop(); } ans=a2-a1; ji.push(ans); } if(b[i]=='/') { if(!ji.empty()) { a1=ji.top(); ji.pop(); } if(!ji.empty()) { a2=ji.top(); ji.pop(); } ans=a2/a1; ji.push(ans); } } if(!ji.empty()){ans=ji.top();} printf("%d\n",ans); } return 0;}
0 0
- 4:中缀表达式的值
- 中缀表达式的值
- 中缀表达式的值
- 中缀表达式的值
- 2-4:中缀表达式的值
- 求中缀表达式的值
- 计算中缀表达式的值
- POJ 中缀表达式的值
- poj 中缀表达式的值
- 计算中缀表达式的值
- 【Openjudge】中缀表达式的值
- 计算中缀表达式字符串的值
- [栈]求中缀表达式的值
- OpenJudge题目解析-中缀表达式的值
- 中缀表达式的转换
- 中缀表达式的转换
- 中缀表达式转后缀表达式_求表达式的值
- 直接利用中缀表达式求算术表达式的值(C#)
- 大水法sdf
- 算法4
- Oracle精选面试题及答案
- 【C++】计算进位的次数
- world文档编写规范
- 4:中缀表达式的值
- BSEG和BSIS、BSAS、BSID、BSAD、BSIK、BSAK 六个表的关系
- “警察”票房破2.7亿 创成龙电影最快破亿纪录
- 天猫浏览型应用的CDN静态化架构演变
- 请教关于VS2005的问题
- NAND FLASH学习笔记之MTD下nand flash驱动(一)
- 如何恢复 Linux 上删除的文件
- 好的界面设计方法 网页爬虫
- debian l7-filter