四则运算式的程序解析(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;}
当然上面这个程序可能还有不足点,也可能有错误的算法,希望发现错误的朋友能帮我指出来!谢谢了!
- 四则运算式的程序解析(C++版)
- 分数的四则运算(c++)
- 四则运算(带括号)的小程序
- C语言编写程序,实现多个非负整数四则运算的功能
- Java实现四则运算的解析
- 关于四则运算的程序算法
- 第十五周C++【任务二】设计分数类,开发一个窗口式程序,可以完成分数的四则运算
- 四则运算表达式求值程序(C语言版)
- 自动出题程序(10以内的数字的四则运算)
- 有理数的四则运算 C、java
- 大数四则运算(C语言)
- 大数之四则运算(C++)
- 简易四则运算编译器(自己的创作 C语言)
- C语言数据结构----栈的应用(四则运算)
- △【OJ】(二)---C---分数类的四则运算
- 栈的测试--四则运算表达式求值(C语言)
- 分数的四则运算及化简(C语言实现)
- 四则运算程序
- 马的遍历
- Linux下的音频采集与回放
- JSP内置对象
- asp.net成长日记
- Java Socket 网络编程心跳设计概念
- 四则运算式的程序解析(C++版)
- 转储2
- 执行页导航
- vb标准(二):代码的注释
- Java实现链表
- 一年过去了,再回来
- Xpath 的数据绑定语法
- C语言程序优化原则举例
- AdRotator广告控件