中缀转后缀表达式并计算的知识点
可以参考: 点我访问
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1237
此题我的代码必须用C++交才能过,估计涉及到精度问题!
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <sstream>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <cstdlib>
#include <iomanip>
using namespace std;
stack<string> signStack;
queue<string> lastQueue;
struct node
{
string ansString;
double ansNum;
};
// 计算运算结果
double getCalAns(string signString, double a, double b)
{
double nowNum;
if(signString == "+"){
nowNum = a + b;
}
else if(signString == "-"){
nowNum = a - b;
}
else if(signString == "*"){
nowNum = a * b;
}
else if(signString == "/"){
nowNum = a / b;
}
return nowNum;
}
//得到加减乘除的优先级
int getSignLevel(string signString)
{
if(signString == "+" || signString == "-"){
return 1;
}
else if(signString == "*" || signString == "/"){
return 2;
}
return 0;
}
//比较两个符号的等级用stack弹出符号
bool cmpSign(string pushString, string stackSign)
{
if(getSignLevel(pushString) > getSignLevel(stackSign)){
return true;
}
return false;
}
void stack_push(string pushString)
{
if(pushString == "+" || pushString == "-" || pushString == "*" || pushString == "/"){
//当signStack不为空时
while(signStack.size() && !cmpSign(pushString, signStack.top())){
lastQueue.push(signStack.top());
signStack.pop();
}
//最后把当前符号放入
signStack.push(pushString);
}
else if(pushString == "("){
signStack.push(pushString);
}
else if(pushString == ")"){
while(signStack.top() != "("){
lastQueue.push(signStack.top());
signStack.pop();
}
//弹出(
signStack.pop();
}
}
// 中缀转后缀并计算结果
node getMediumTOPost(string mediumStrng)
{
int len = mediumStrng.length();
string numString = "";
for(int i = 0; i < len; i++){
//为空字符
if(mediumStrng[i] == '*' || mediumStrng[i] == '/' || mediumStrng[i] == '+' || mediumStrng[i] == '-'){
//把数字压入
if(numString.size()){
lastQueue.push(numString);
numString = "";
}
stack_push(mediumStrng.substr(i, 1));
}
else if(mediumStrng[i] == '(' || mediumStrng[i] == ')'){
//把数字压入
if(numString.size()){
lastQueue.push(numString);
numString = "";
}
stack_push(mediumStrng.substr(i, 1));
}
else if(mediumStrng[i] != ' '){
numString += mediumStrng[i];
}
if(i == len - 1){
//把数字压入
if(numString.size()){
lastQueue.push(numString);
numString = "";
}
}
}
string ansString = "";
while(signStack.size()){
lastQueue.push(signStack.top());
signStack.pop();
}
queue<string> getNumQueue = lastQueue;
stack<double> tmpStack;
//double lastNum = 0;
while(lastQueue.size()){
ansString += (lastQueue.front() + " ");
lastQueue.pop();
}
//将字符串转换为double
while(getNumQueue.size()){
string stmp = getNumQueue.front();
if(stmp == "+" || stmp == "-" || stmp == "*" || stmp == "/"){
double a, b;
b = tmpStack.top();
tmpStack.pop();
a = tmpStack.top();
tmpStack.pop();
a = getCalAns(stmp, a, b);
tmpStack.push(a);
}
else{
tmpStack.push(atof(stmp.c_str()));
}
getNumQueue.pop();
}
//node ansNode;
//ansNode.ansNum = tmpStack.top();
//ansNode.ansString = ansString.substr(0, ansString.length() - 1);
return node{ansString.substr(0, ansString.length() - 1), tmpStack.top()};
}
int main()
{
ios::sync_with_stdio(false);
string cins;
while(getline(cin, cins) && cins != "0"){
//栈清空
while(signStack.size()) signStack.pop();
while(lastQueue.size()) lastQueue.pop();
node ansNode = getMediumTOPost(cins);
//cout << ansNode.ansString << endl;
cout << fixed << setprecision(2) << (ansNode.ansNum) << endl;
}
return 0;
}