济南品牌网站建设价格/查询网 域名查询
啥也不说,直接code,赞不绝口了。
思路步骤都在注释里。
非递归求前序表达式(波兰表达式)
//简单的数字【1,9】
//非递归 前序表达式
double preCal(string s) {stack<double> sk;//从字符串的右边往左扫描,数字进栈,非数字处理//遇到符号处理:从栈中依次弹出两个数字,第一个为左操作数,第二个为右操作数,计算结果再压入栈中for (int i = s.size() - 1; i >= 0; i--) {if (s[i] >= '0' && s[i] <= '9') {sk.push(s[i] - '0');}else {int l = sk.top(); sk.pop();//因为是从右往左扫描,所以先出来的是左操作数int r = sk.top(); sk.pop();char op = s[i];switch (op) {case '+':sk.push(l + r);break;case '-':sk.push(l - r);break;case '*':sk.push(l * r);break;case '/':if (r != 0)sk.push(l * 1.0 / r);elseexit(1);break;}}}return sk.top();//最后只剩下一个数字,即为result
}
非递归求逆波兰表达式
//非递归 后续表达式
double posCal(string s) {//与前序表达式计算基本一样,唯一不同的是:需要从左往右遍历字符串s//所以也就造成了:在处理的时候,先出栈的是右操作数,再出来的是左操作数stack<double>sk;for (int i = 0; i < s.size(); i++) {if (s[i] >= '0' && s[i] <= '9') {sk.push(s[i] - '0');}else {int r = sk.top(); sk.pop();int l = sk.top(); sk.pop();char op = s[i];switch (op) {case '+':sk.push(l + r);break;case '-':sk.push(l - r);break;case '*':sk.push(l * r);break;case '/':if (r != 0)sk.push(l * 1.0 / r);elseexit(1);break;}}}return sk.top();
}
递归求波兰表达式
//递归 波兰表达式
float recurPrecal() {char arr[50];cin >> arr;//注意:输入表达式时空格隔开,其实一次只接受一个字符而已switch (arr[0]) {case '+':return recurPrecal() + recurPrecal();break;case '-':return recurPrecal() - recurPrecal();break;case '*':return recurPrecal() * recurPrecal();break;case '/':return recurPrecal() *1.0/ recurPrecal();break;default:return atof(arr);//把字符串转换成浮点数break;}
}