中缀转后缀表达式并计算

中缀转后缀表达式并计算的知识点

可以参考: 点我访问
题目链接: 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;
}

发布了27 篇原创文章 · 获赞 5 · 访问量 2507

猜你喜欢

转载自blog.csdn.net/HKer_YM/article/details/95319721