• 简单中缀算数表达式求值


    任务描述

    利用栈实现中缀表达式的求值。 说明: (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
    {
    
        // 待补充代码
    }
  • 相关阅读:
    跟一声响骚扰说“拜拜”
    来电过滤 全靠防火墙
    android sd卡读取数据库
    Java程序员十戒
    Java常用的正则表达式验证
    Java 3D 教程:6. Java 3D 与用户界面
    成为Java高手的25个学习目标
    Java数据结构内容整理
    Java中类与类之间的关系
    求助,Java字符串分割问题
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13917641.html
Copyright © 2020-2023  润新知