数据结构C语言用栈实现表达式计算器,求完整源代码,邮箱601816948@qq.com

需求描述:用户输入一个完整的四则运算表达式,程序能够求出表达式的值。要求能够处理括号、正负符号、加减乘除四则运算等。基本要求:括号处理、正负符号处理、加减乘除四则运算以及... 需求描述:
用户输入一个完整的四则运算表达式,程序能够求出表达式的值。要求能够处理括号、正负符号、加减乘除四则运算等。
基本要求:
括号处理、正负符号处理、加减乘除四则运算以及浮点数在表达式中的处理。
应用:
表达式合法性检查、栈的应用、优先级别的判定

谢谢!
邮箱601816948@qq.com
展开
 我来答
曾全4M
2013-12-22 · 超过30用户采纳过TA的回答
知道答主
回答量:206
采纳率:0%
帮助的人:57.2万
展开全部

#include<iostream>#include<sstream>#include<stack>#include<string>using namespace std;float stringToNum(const string& str)  {      istringstream iss(str);      float num;      iss >> num;      return num;      }

int In(string c){ if(c == "+" || c == "-" || c == "*" || c == "/" || c == "(" || c == ")"|| c == "#")  return 1; else  return 0;}

string procede(string op1,string op2){ if(op1 == "+" && (op2 == "*"||op2 =="/"||op2 =="("))  return "<"; if(op1 == "+" && (op2 == "+"||op2 =="-"||op2 ==")"||op2 =="#"))  return ">"; if(op1 == "-" && (op2 == "*"||op2 =="/"||op2 =="("))  return "<"; if(op1 == "-" && (op2 == "+"||op2 =="-"||op2 ==")"||op2 =="#"))  return ">"; if(op1 == "*" && op2 =="(")  return "<"; if(op1 == "*" && (op2 == "+"||op2 =="-"||op2 =="*"||op2 =="/"||op2 ==")"||op2 =="#"))  return ">"; if(op1 == "/" && op2 =="(")  return "<"; if(op1 == "/" && (op2 == "+"||op2 =="-"||op2 =="*"||op2 =="/"||op2 ==")"||op2 =="#"))  return ">"; if(op1 == "(" && op2 ==")")  return "="; if(op1 == "(" && (op2 =="+"||op2 =="-"||op2 =="*"||op2 =="/"||op2 =="("))  return "<"; if(op1 == ")" && (op2 =="+"||op2 =="-"||op2 =="*"||op2 =="/"||op2 ==")"||op2 =="#"))  return ">"; if(op1 == "#" && (op2 =="+"||op2 =="-"||op2 =="*"||op2 =="/"||op2 =="("||op2 =="#"))  return "<";}

float operate(float a,string op,float b){ if(op == "+")  return a+b; if(op == "-")  return a-b; if(op == "*")  return a*b; if(op == "/")  return a/b;}

int evaluateExpression(){ float num1,num2; stack<float> OPND;  //存放运算数 stack<string> OPTR; //存放操作符 OPND.empty(); OPTR.empty(); OPTR.push("#"); std::string c; cin>>c; while(c != "#" || OPTR.top() != "#") {  if(!In(c))//不是运算符进栈  {   OPND.push(stringToNum(c));   cin>>c;  }  else  { //  cout<<procede(OPTR.top(),c)<<endl;   if(procede(OPTR.top(),c) == "<")   {    OPTR.push(c);    cin>>c;   }   else if(procede(OPTR.top(),c) == "=")   {    OPTR.pop();    cin>>c;   }    else if(procede(OPTR.top(),c) == ">")   {    string op = OPTR.top();    OPTR.pop();         num1 = OPND.top();    OPND.pop();         num2 = OPND.top();    OPND.pop();

    OPND.push(operate(num2,op,num1));   }  }   } if(!OPND.empty()) return OPND.top(); else return 0;}

int main(){ while(1) {  cout<<evaluateExpression()<<endl; }  system("pause");  return 0;}

BuenosAiress
2013-12-22 · TA获得超过303个赞
知道小有建树答主
回答量:345
采纳率:33%
帮助的人:137万
展开全部
有java版的你要麽,自己手工敲的代码,要得话留言
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式