一道C++题目
- 提问者网友:辞取
- 2021-07-29 16:27
- 五星知识达人网友:污到你湿
- 2021-07-29 17:30
- 1楼网友:零点过十分
- 2021-07-29 21:00
这个是别人的。。。你可以参考下。。。
#include<iostream> #include<stack> using namespace std; void mem(); bool judge(char,char); void duizhan( stack<float>&, stack<char>& ); float xiaoshu(float,float); void main() { mem(); } void mem() { int used,pr; float argt; char c; stack<float> num; stack<char> oper; argt=0;pr=0;used=0; cout<<endl<<"请输入待求表达式:"<<endl; while(cin>>c, !cin.eof()) { if(isdigit(c)) { used=1; argt=argt*10+(c-'0'); continue; } //将输入的数字类字符转换成数字; if(c=='+'||c=='-'||c=='*'||c=='/'||c=='.') { if(used) { num.push(argt); argt=0; used=0; } //将转化好的数字压入数字栈; if (oper.empty()||oper.top()=='(') {oper.push(c);continue;} //向操作符栈里压入第一个操作符;解决括号问题; while(!judge(c,oper.top())) { duizhan(num,oper); if (oper.empty()||oper.top()=='(') break; } //根据运算符号优先级,调整运算顺序,并处理优先运算部分; oper.push(c); continue; } if(c=='(') { pr++;oper.push(c);continue; //括号入栈,作为括号内运算的标志; } if(c==')') { pr--; //括号结束,整理括号内的运算结果; if (used) {num.push(argt);argt=0;used=0;} while(!oper.empty()) { if (oper.top()=='(') break; duizhan(num,oper); } oper.pop(); continue; } if(c=='=') //遇到‘=’号,输出结果; { if (pr) {cout<<"括号数目不匹配,请检查并重新输入!"<<endl;return;} if (used) num.push(argt); while(!oper.empty()) duizhan(num,oper); cout<<"表达式的值为: "<<num.top()<<endl; return; } else {cout<<"表达式输入错误,请重新输入!"<<endl;return;} } } bool judge(char s,char t) { if ((s=='*'||s=='/')&&(t=='+'||t=='-')) return true; if (s=='.') return true; return false; } void duizhan(stack<float>& num,stack<char>& oper) { float a,b,r; b=num.top();num.pop(); a=num.top();num.pop(); switch( oper.top() ) { case ('+'):r= a+b;break; case ('-'):r= a-b;break; case ('*'):r= a*b;break; case ('/'):r= a/b;break; case ('.'):r=xiaoshu(a,b); }; num.push(r); oper.pop(); } float xiaoshu(float m, float n) //处理小数 { while (n>=1) n/=10; n+=m; return n; }
例:
- 2楼网友:長槍戰八方
- 2021-07-29 19:31
请楼主补充说明一下吧!
- 3楼网友:傲气稳了全场
- 2021-07-29 18:53