BIT2010年上机第二题
来源:互联网 发布:linux sigpipe 编辑:程序博客网 时间:2024/05/15 02:57
题目要求:
输入表达式,输出值。分两种情况:中缀表达式和后缀表达式。
解题思路
1.中缀表达式,需要转换成后缀表达式
2.后缀表达式直接计算
设置一个符号栈,然后将输入的表达式按照字符进行读取,如果数值则放进后缀表达式的字符串汇中,如果是符号,则比对栈内的符号和当前指向的符号的优先级。
很经典的一道题目,和括号匹配,进制转换,迷宫问题都是一样的,运用到了栈
也是参考了一些网友的解题思路和代码
代码如下
#include<iostream>#include<stack>#include<string>#include<sstream>using namespace std;int isp(char ch){switch(ch){case'#':return 0;case'(':return 1;case'+':return 3;case'-':return 3;case'*':return 5;case'/':return 5;case')':return 6;}}int icp(char ch){switch(ch){case'#':return 0;case'(':return 6;case'+':return 2;case'-':return 2;case'*':return 4;case'/':return 4;case')':return 1;}}//获得后缀表达式string shorten(string s){stack<char> b; //符号栈b.push('#');string str; //后缀表达式for(int i =0;i<s.size();i++){if(isdigit(s[i])||s[i]=='.'){while(isdigit(s[i])||s[i]=='.') str +=s[i++];i--;str+='$';}else{if(isp(b.top())<icp(s[i])){b.push(s[i]);continue;}else if(isp(b.top())>icp(s[i])){while(1){str +=b.top();b.pop();if(isp(b.top())==icp(s[i])){ //相等()b.pop();break;}if(isp(b.top())<icp(s[i])){b.push(s[i]);break;}}}}}while(!b.empty()){str +=b.top();b.pop();}return str;}//计算后缀表达式int compute(string str){stack<double> stack;double a,b,c;string s;for(int i=0;i<str.size();i++){if(str[i]!='$'){if(isdigit(str[i])||str[i]=='.'){while(isdigit(str[i])||str[i]=='.') s+=str[i++];i--;}else{if(str[i]=='*'){a = stack.top();stack.pop();b = stack.top();stack.pop();c = a*b;stack.push(c);}if(str[i]=='/'){a = stack.top();stack.pop();b = stack.top();stack.pop();c = a/b;stack.push(c);}if(str[i]=='+'){a = stack.top();stack.pop();b = stack.top();stack.pop();c = a+b;stack.push(c);}if(str[i]=='-'){a = stack.top();stack.pop();b = stack.top();stack.pop();c = a-b;stack.push(c);}}}else{istringstream iss(s); //str2doubledouble x;iss>>x;stack.push(x);s="";}}return stack.top();}int main(){string s; //表达式char ch;string sur;cout<<"请进行选择操作 1.中缀表达式计算 2.后缀表达式计算 3.退出"<<endl;while(cin>>ch){if(ch=='1'){cout<<"请输入表达式,以#结束:"<<endl;cin>>s;sur = shorten(s);cout<<"后缀表达式:"<<sur<<endl;cout<<"表达式的结果:"<<compute(sur)<<endl;}else if(ch=='2'){cout<<"请输入表达式,数值用$间隔:"<<endl;cin>>s;cout<<"表达式的结果:"<<compute(s)<<endl;}else if(ch=='3'){break;}else{cout<<"输入非法,请重新输入"<<endl;}cout<<"请进行选择操作 1.中缀表达式计算 2.后缀表达式计算 3.退出"<<endl;}return 0;}
0 0
- BIT2010年上机第二题
- BIT2010上机第一题
- BIT2013年上机第二题
- 华为上机第二题
- 华为上机第二题
- C#第二章上机题
- 清华大学2001年复试上机题 第二套 解题报告
- 清华大学2002年复试上机题 第二套 解题报告
- ZJU 09 复试上机 第二题
- c++第五次上机实验第二题
- 华为2016上机考试第二题
- S2 深入.NET 第二章 上机题
- ZJU-PAT 1055. The World's Richest (25) 浙大2013年上机复试第二题
- ZJU-PAT 1078. Hashing (25) 浙大2014年上机复试第二题
- 第二周上机任务
- 第二周上机实验
- 第二章 上机练习
- 第二章上机练习
- android SQL
- HDUOJ
- μC/OS中的中断处理
- 获取连接到wifi热点的手机信息。
- sqlAlchemy的sql语句查询
- BIT2010年上机第二题
- python学习 迭代器
- 基于HIVE数据库出报表的后台相关工具介绍
- Python 文档
- 设计模式之外观模式
- 【杭电OJ】1874--畅通工程续-最短路(dijkstra)
- Python 模块学习:os模块
- iptables_规则_详解
- 微服务Microservice