四则运算式的程序解析(C++版)

来源:互联网 发布:手机指纹锁软件哪种好 编辑:程序博客网 时间:2024/05/07 07:19

刚花了一个小时左右的时间写了这个程序,用它可以计算任意长度的任意复杂度的四则运算式(当然这是在硬件条件的支持限度内)

#include<iostream>#include<stack>using namespace std;//用来判断读入的一个字符是否是数字bool isData(char ch){ if(ch>47&&ch<58) return true; return false;}//用来判断是否是乘除运算bool isMulOrDiv(char ch){ if(ch == '*' || ch == '/') return true; return false;}//用来判断是否是加减运算bool isPlusOrMinu(char ch){ if(ch == '-' || ch == '+') return true; return false;}//用来做相应的加减乘除运算float operate(float data,float data2,char ope){ switch(ope) {  case '*':   return data * data2;  case '/':   return data / data2;  case '+':   return data + data2;  case '-':   return data - data2;  default:   return 0; }}//主函数int main(){ stack<char> stackOperator; //操作符栈 stack<float> stackData; //操作数栈 char exp[100],ope; float data,data2; //从用户输入的串中解析出来的数据 int length = 0; //用来存放字符串的长度 printf("Please input the expression:/n"); cin.getline(exp,100); length = strlen(exp); //往操作符栈中推入做为结束标志的‘#’ stackOperator.push('#'); //做一个循环,分析式子 for(int i = 0 ; i < length ; i ++) {  //忽略空格  if(exp[i] == ' ') continue;  if(isData(exp[i])) //如果读到的字符可以解析成数字时  {   data = exp[i]-48;   while(isData(exp[i+1]))   {    data = data*10 + (exp[i+1]-48);    i ++;   }   stackData.push(data);  }  else if(isMulOrDiv(exp[i])) //如果是乘或除的话  {   ope = exp[i];   if(exp[i+1] != '(')   {    data2 = exp[i+1]-48;    i++;    while(isData(exp[i+1]))    {     data2 = data2*10 + (exp[i+1]-48);     i ++;    }    data = stackData.top();    stackData.pop();    stackData.push(operate(data,data2,ope));   }   else    stackOperator.push(exp[i]);  }  else//如果是加减运算符或括号时  {   //加减   if(isPlusOrMinu(exp[i]))    stackOperator.push(exp[i]);   //括号   switch(exp[i])   {    case '(':     stackOperator.push(exp[i]);     break;    case ')':     while(stackOperator.top() != '(') //说明括号里面的式子还没处理完     {      ope = stackOperator.top();      stackOperator.pop();      data2 = stackData.top();      stackData.pop();      data = stackData.top();      stackData.pop();      stackData.push(operate(data,data2,ope));     }     stackOperator.pop();if(isMulOrDiv(stackOperator.top())){ope = stackOperator.top();stackOperator.pop();data2 = stackData.top();stackData.pop();data = stackData.top();stackData.pop();stackData.push(operate(data,data2,ope));}     break;   }  } } //到这时,整个式子已经读取完了,检查栈,并做相应的处理 while(stackOperator.top() != '#') {  ope = stackOperator.top();  stackOperator.pop();  data2 = stackData.top();  stackData.pop();  data = stackData.top();  stackData.pop();  stackData.push(operate(data,data2,ope)); } cout<<stackData.top(); //cout<<exp<<endl<<exp[2]; return 0;}


当然上面这个程序可能还有不足点,也可能有错误的算法,希望发现错误的朋友能帮我指出来!谢谢了!

原创粉丝点击