表达式求值 中缀式转换成后缀式
2016-02-19 17:14
447 查看
nyoj467
中缀式变成后缀式输出
思路模拟出栈入栈进行计算
将运算符与数字分别存入两个栈中
1 当遇到数字时就直接入栈(数字栈)
2 当运算符栈中为空时 第一个字符要入栈
3 当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)
a 当栈顶元素不为 ( 时 输出
else 就让该运算符入栈(退出循环)
4 当一个运算符的预算等级小于 栈顶运算符时
a 当栈顶为 ) 时 输出
else 入栈
5 最后将运算符栈中的运算符全部用掉
输出
nyoj35
表达式求值
思路模拟出栈入栈进行计算
将运算符与数字分别存入两个栈中
1 当遇到数字时就直接入栈(数字栈)
2 当运算符栈中为空时 第一个字符要入栈
3 当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)
a 当栈顶元素不为 ( 时 就进行后续运算
else 就让该运算符入栈(退出循环)
4 当一个运算符的预算等级小于 栈顶运算符时
a 当栈顶为 ) 时 就进行后续运算
else 入栈
5 最后将运算符栈中的运算符全部用掉
中缀式变成后缀式输出
思路模拟出栈入栈进行计算
将运算符与数字分别存入两个栈中
1 当遇到数字时就直接入栈(数字栈)
2 当运算符栈中为空时 第一个字符要入栈
3 当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)
a 当栈顶元素不为 ( 时 输出
else 就让该运算符入栈(退出循环)
4 当一个运算符的预算等级小于 栈顶运算符时
a 当栈顶为 ) 时 输出
else 入栈
5 最后将运算符栈中的运算符全部用掉
输出
#include<bits/stdc++.h> using namespace std; char op[10000]; char s[2000]; int judge(char c) { if(c=='+'||c=='-')return 1; if(c=='/'||c=='*')return 2; if(c=='(')return 3; else return 4; } int main() { int n; while(~scanf("%d",&n)) { while(n--) { scanf("%s",s); int top=0; for(int i=0; s[i]!='=';) { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { while(s[i]>='0'&&s[i]<='9'||s[i]=='.') printf("%c",s[i++]); printf(" "); continue; } if(top==0) { op[++top]=s[i++]; continue; } if(judge(op[top])>=judge(s[i])) { while(judge(op[top])>=judge(s[i])&&top>0) //循环判断 { //排除 5+6*7-9 这一类的情况 输出 5 6 7*+9- //用if的话会出现 5 6 7* 9 - +; error if(op[top]!='(') printf("%c ",op[top--]); else break; } op[++top]=s[i]; i++; } else { if(s[i]==')') { while(op[top]!='(') printf("%c ",op[top--]); top--; } else op[++top]=s[i]; i++; } } while(top) printf("%c ",op[top--]); printf("=\n"); } } return 0; }
nyoj35
表达式求值
思路模拟出栈入栈进行计算
将运算符与数字分别存入两个栈中
1 当遇到数字时就直接入栈(数字栈)
2 当运算符栈中为空时 第一个字符要入栈
3 当一个运算符的运算等级 大于或等于 栈顶字符 时 (循环判断)
a 当栈顶元素不为 ( 时 就进行后续运算
else 就让该运算符入栈(退出循环)
4 当一个运算符的预算等级小于 栈顶运算符时
a 当栈顶为 ) 时 就进行后续运算
else 入栈
5 最后将运算符栈中的运算符全部用掉
#include<bits/stdc++.h> using namespace std; char op[10000]; double mi[10000]; char s[10000]; int judge(char c) { if(c=='+'||c=='-')return 1; if(c=='/'||c=='*')return 2; if(c=='(')return 3; else return 4; } void solve(char op[],double mi[],int &tail,int &top) { //通过两个栈的出栈与入栈 进行后缀式计算求值 if(op[top]=='+') mi[tail-1]=mi[tail-1]+mi[tail]; if(op[top]=='-') mi[tail-1]=mi[tail-1]-mi[tail]; if(op[top]=='*') mi[tail-1]=mi[tail-1]*mi[tail]; if(op[top]=='/') mi[tail-1]=mi[tail-1]/mi[tail]; top--; //字符栈出栈 tail--; //数字栈出栈 } int main() { int n; while(~scanf("%d",&n)) { while(n--) { scanf("%s",s); int top=0,tail=0; for(int i=0; s[i]!='=';) { double sum=0; if(s[i]>='0'&&s[i]<='9'||s[i]=='.') //数字的入栈 { while(s[i]>='0'&&s[i]<='9') { sum*=10; sum+=s[i++]-'0'; } if(s[i]=='.') { i++; double bits=0.1; while(s[i]>='0'&&s[i]<='9') { sum+=bits*(s[i++]-'0'); bits*=0.1; } } mi[++tail]=sum; //入栈 continue; } if(top==0) { op[++top]=s[i++]; //运算符的入栈 continue; } if(judge(op[top])>=judge(s[i])) { while(judge(op[top])>=judge(s[i])&&top>0) { if(op[top]!='(') { //后缀式计算 solve(op,mi,tail,top); } else break; } op[++top]=s[i]; i++; } else { if(s[i]==')') { while(op[top]!='(') { //后缀式计算 solve(op,mi,tail,top); } top--; } else op[++top]=s[i]; i++; } } while(top) { solve(op,mi,tail,top); } printf("%.2lf\n",mi[tail]); } } return 0; }
相关文章推荐
- 深度学习系列(1)——简要概念
- struct 和typedef struct
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
- HTTP状态码
- C语言
- ios开发- 将字符串切割成数组 componentSeparatedByString
- 接口委托实现--通过类的对象
- Jenkins 一: 环境安装以及配置
- AJAX单元测试傻瓜教程
- PHP之记录错误日志
- 仿ios的对话框
- putty
- java解析xml 之SAX 解析方式原理
- 14.UITextField内容缩进/placeholder改变颜色
- 学习新东西的唯一方法
- [dfs+水] hdu 4462 Scaring the Birds
- 随想-经验
- 和我一起学《HTTP权威指南》——Web服务器
- BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)
- C#和Java时间字符串的毫秒字符不同