引用第13楼依然随意于2007-06-30 18:36发表的:有道理,请问你把他搞出来没有?
引用第18楼依然随意于2007-06-30 19:01发表的:极具价值,让大家了解了一点面试的知识.
//writen by sunboy//2007.6.30#include <iostream>#include <string>#include <vector>using namespace std;vector <string> vec_num,vec_symbol;string transform(string headExp); //将中缀表达式转化为后缀表达式int CalrearExp(vector <string> &vec); //计算后缀表达式的值int stringToint(string s){ int res=0,i; int len=s.length(); for(i=0;i<len;i++) { res*=10; res+=(s[i]-'0'); }return res;}int main(){ string headExp,rearExp; int ans; cout<<"请输入表达式:"<<endl; cin>>headExp; rearExp=transform(headExp); cout<<rearExp<<endl; ans=CalrearExp(vec_num); cout<<ans<<endl; return 0;}/* 中缀算术表达式转后缀算术表达式 算法: 1 读入运算对象,直接输出 2 ( 运算符进栈 3 ) 运算符,栈内的最上一个( 以上的运算符退栈,(也退栈 4 读入运算符,进入运算栈 4.1 后进栈的运算符 > 先进栈的运算符,运算符进栈 (优先级比较) 4.2 后进栈的运算符 <= 先进栈的运算符,将栈内的运算符退栈输出,再进栈 5 # 结束符 */string transform(string headExp){ string res,tmp; int i,j,len=headExp.length(); i=0; char ch; int top; while(i<len) { ch=headExp[i++]; switch(ch) { case '(': vec_symbol.push_back ("("); break; case ')': top=vec_symbol.size (); j=top-1; while(vec_symbol[j]!="(") { vec_num.push_back (vec_symbol[j]); vec_symbol.erase(vec_symbol.begin ()+j); j--; } vec_symbol.erase(vec_symbol.begin ()+j); break; case '+': case '-': top=vec_symbol.size (); j=top-1; while(j>=0&&vec_symbol[j]!="(") { vec_num.push_back (vec_symbol[j]); vec_symbol.erase(vec_symbol.begin ()+j); j--; } if(ch=='+') vec_symbol.push_back ("+"); else vec_symbol.push_back ("-"); break; case '*': case '/': top=vec_symbol.size (); j=top-1; while(j>=0&&vec_symbol[j]=="*"||vec_symbol[j]=="/") { vec_num.push_back (vec_symbol[j]); vec_symbol.erase(vec_symbol.begin ()+j); j--; } if(ch=='*') vec_symbol.push_back ("*"); else vec_symbol.push_back ("/"); break; default: tmp=""; while(ch>='0'&&ch<='9') { tmp+=ch; ch=headExp[i++]; } i--; vec_num.push_back (tmp); } }for(i=vec_symbol.size ()-1;i>=0;i--) vec_num.push_back (vec_symbol[i]);for(i=0;i<vec_num.size ();i++){ res+=vec_num[i]; res+=" ";} return res;} int CalrearExp(vector <string> &vec){ int res,i; vector<int> vec_cal; int len=vec.size (); for(i=0;i<len;i++) { if(vec[i]=="+") { vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]+vec_cal[vec_cal.size ()-1]; vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1); }else if(vec[i]=="-") { vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]-vec_cal[vec_cal.size ()-1]; vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1); }else if(vec[i]=="*") { vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]*vec_cal[vec_cal.size ()-1]; vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1); }else if(vec[i]=="/") { if(vec_cal[vec_cal.size ()-1]==0) { cout<<"除零错误"<<endl; vec_cal[vec_cal.size ()-1]=1; } vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]/vec_cal[vec_cal.size ()-1]; vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1); }else { int num=stringToint(vec[i]); vec_cal.push_back (num); } } res=vec_cal[0]; return res;}
引用第24楼krisfer于2007-07-01 14:36发表的:看来有空还是要好好学习一下C++呀,不然这个什么也不会,不懂,以后咋整呀。。。。。
引用第17楼kangtalc于2007-06-30 18:50发表的:第一道题目就是以前上C++课的时候的一个作业题,这道题目很简单就不说了吧第2道题目就是一个高精度问题,因为要求任意位数,所以不能用一般的数据类型做,应该用用数组来做,自己模拟+,-,*,/算,转进制的方法也很简单如果你练习过ACM的题目,你会发现这些题目真的简单题~~~