本文实例为大家分享了C实现计算器功能的具体代码供大家参考具体内容如下说明前面简单尝试过计算器只能支持加减乘除这次完善了计算器的功能支持带括号的表达式支持±*/ (加减乘除基本运算支持^(指数)运算支持取负号运算(-num)支持阶乘。输入格式及结果括号和基本运算指数运算取负和混合运算阶乘代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495//支持带括号的表达式,支持-*/、^(指数)、取负、!(阶乘)#include iostream#include stack#include math.husingnamespacestd;doubleinStack();//核心函数将操作符有序的入栈计算 最后返回结果voidcalculate(stackchar Ope, stackdouble Num);//用来计算加减乘除, 结果放在数字栈顶voidfactorial(stackdouble Num);//用来计算阶乘intpriority(charope_);//用来计算操作符的优先级intmain() {doubleresult;//最后的结果cout 请输入\n;result inStack();//将缓冲区的操作符和数字压入栈cout 结果是\n result;return0;}doubleinStack() {stackchar Ope;stackdouble Num;charope_;doublenum_;while(1) {if(cin.peek() 0 cin.peek() 9) {//判断下一个是否是数字cin num_;Num.push(num_);//数字直接入栈}else{cin ope_;if(ope_ ) {while(!Ope.empty()) calculate(Ope, Num);//如果符号栈不空就一直计算returnNum.top();//如果是等号且符号栈顶为空就返回数字栈顶元素}elseif(ope_ !) factorial(Num);//如果是就阶乘elseif(ope_ (||Ope.empty()) Ope.push(ope_);//如果符号是左括号或符号栈为空直接压入elseif(ope_ )) {//如果是右括号while(Ope.top() !() calculate(Ope, Num);//一直计算完括号里的Ope.pop();//左括号出栈}elseif(priority(Ope.top()) priority(ope_)) {//如果栈顶符号的优先级大于等于当前calculate(Ope, Num);//计算结果压入数字栈,取出当前栈顶Ope.push(ope_);//压入当前符号}elseOpe.push(ope_);//否则就压入符号栈}}}voidcalculate(stackchar Ope, stackdouble Num) {doublea, b;if(Ope.top() -) {a Num.top(); Num.pop();Ope.pop();//取出负号Num.push(-a);//压入负值if(!Num.empty()) {if(Ope.empty() || Ope.top() !()Ope.push();//如果前面还有数字就压入即变成加负值}}else{a Num.top(); Num.pop();b Num.top(); Num.pop();if(Ope.top() ) Num.push(b a);elseif(Ope.top() *) Num.push(b * a);elseif(Ope.top() /) Num.push(b / a);elseif(Ope.top() ^) Num.push(pow(b, a));Ope.pop();}}voidfactorial(stackdouble Num) {inta static_castint(Num.top());intresult1;for(inti 1; i a; i) result * i;Num.push(static_castdouble(result));}intpriority(charope_) {if(ope_ ()return0;elseif(ope_ || ope_ -)return1;elseif(ope_ *|| ope_ /)return2;elseif(ope_ ^)return3;}以上就是本文的全部内容希望对大家的学习有所帮助