简单中缀算数表达式求值

任务描述

利用栈实现中缀表达式的求值。 说明: (1)表达式中所有的操作数为单一的数字:0~9; (2)运算符仅包含:+ - * ( ),其中“-”仅为减号,非负号; (3)表达式符号串的长度不超过100。

相关知识

中缀表达求值可分为两步:。 (1)把中缀表达式转换为后缀表达式; (2)根据后缀表达式进行求值

编程要求

可利用第3关和第4关成果,补充完成右边代码,完成本关挑战。 读取中缀表达式,并基于栈的插入、删除等基本操作实现中缀表达式转化为后缀表达式。

输入输出说明

输入有多组测试用例,每一组测试用例占一行,每一组测试用例为仅包含+-*/等运算法和0~9的运算数,以及()的简单算式中缀表达式,表达式的长度不超过100个字符。输出为该表达式的计算结果,每个输出占一行

测试输入: 1+((2+3)*4) 1+((2+3)*4)-5

预期输出: 21 16

输入格式:中缀表达式 输出格式:中缀表示的结果

#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
const int Maxsize = 100;
int z=0;
char postexp[100];
int cals(string s);//计算后缀表达式A的值
int cal(string s);//计算表达式 x operator y的值
int get_priority(char ch);//获取命题联接词的运算优先级
void exp_postexp(string s);//把中缀式A转换为后缀式R

int main()
{
    char inexp[Maxsize] = "";//中缀式
    char postexp[Maxsize] = "";//后缀式    
    int result;
    while (cin >> inexp)//循环输入测试用例
    {
     // 待补充代码
        exp_postexp(inexp);
        cout<<cals(inexp);
    }
}
bool cmp(char a,char b){
    if(a=='*'||a=='/'){
        if(b=='*'||b=='/'){
            return false;
        }
        return true;
    }
    return false;
}

int get_priority(char ch)//计算表达式的值
{
  // 待补充代码
}
void exp_postexp(string s)//把中缀式A转换为后缀式R
{
    // 待补充代码
    stack<char>op;
    int len=s.length();
    for(int i=0;i<len;i++){
        char t=s[i];
        if(t=='('){
            op.push(t);
        }else if(t==')'){
            char ope=op.top();
            while(ope!='('){
                postexp[z++]=ope;
                op.pop();
                ope=op.top();
            }
            op.pop();
        }else if(t>='0'&&t<='9'){
            postexp[z++]=t;
        }else{
            if(op.empty()){
                op.push(t);
            }else{
                char stp=op.top();
                if(stp=='('||cmp(t,stp))op.push(t);
                else{
                    while(!cmp(t,stp)&&!op.empty()&&stp!='('){
                        op.pop();
                        postexp[z++]=stp;
                        if(!op.empty())stp=op.top();
                    }
                    op.push(t);
                }
            }
        }
    }
    while(!op.empty()){
        char t=op.top();
        postexp[z++]=t;
        op.pop();
    }
}
int cals(string s) //计算表达式的值
{
    // 待补充代码
    stack<float>val;
    val.push(1.0*(postexp[0]-'0'));
    for(int i=1;i<z;i++){
        char t=postexp[i];
        if(t>='0'&&t<='9')val.push((t-'0')*1.0);
        else{
            float x=val.top();val.pop();
            float y=val.top();val.pop();
            float tmp;
            if(t=='+')tmp=x+y;
            if(t=='-')tmp=y-x;
            if(t=='*')tmp=y*x;
            if(t=='/')tmp=y/x;
            val.push(tmp);
        }
    }
    return val.top();
}

int cal(int x, int y, char op)//计算表达式 x operator y的值,例3+4 返回7
{

    // 待补充代码
}
原文地址:https://www.cnblogs.com/xxxsans/p/13917641.html