首页 > 其他分享 >1358:中缀表达式值(expr)

1358:中缀表达式值(expr)

时间:2024-05-25 10:56:19浏览次数:9  
标签:1358 中缀 int expr s1 str s2 push 表达式

题目网址:信息学奥赛一本通(C++版)在线评测系统

题目介绍:

1358:中缀表达式值(expr)


时间限制: 1000 ms         内存限制: 65536 KB
提交数:13372    通过数: 4646

【题目描述】

输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。

注意:必须用栈操作,不能直接输出表达式的值。

【输入】

一行为一个以@结束的字符串。

【输出】

如果表达式不合法,请输出“NO”,要求大写。

如果表达式合法,请输出计算结果。

【输入样例】

1+2*8-9@

【输出样例】

8

样例代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
const int N=10000+10;
using namespace std;
 
int n,m;
stack<int> s1;//操作数栈
stack<char> s2;//运算符栈
 
int level(char x)//运算符优先级
{
    if(x=='+'||x=='-')
        return 1;
    if(x=='*'||x=='/')
        return 2;
    if(x=='^')
        return 3;
    return 0;
}
 
void calc(stack<int> &s1,stack<char> &s2)//弹出栈顶元素并计算
{
    /*取出后弹出栈*/
    int y=s1.top();
        s1.pop();
    int x=s1.top();
        s1.pop();
    char z=s2.top();
        s2.pop();
 
    /*根据运算符计算,并压入栈*/
    if(z == '+')
        s1.push(x+y);
    if(z == '-')
        s1.push(x-y);
    if(z == '*')
        s1.push(x*y);
    if(z == '/')
        s1.push(x/y);
    if(z == '^')
        s1.push(pow(x,y));
}
 
int c(int x)
{
    return x != 0;
}
char str[1000000];
int sum[1000000];
 
int main(){
 
    scanf("%s",str+1);
    n = strlen(str+1)-1;//忽略掉@的字符串长度
 
    for(int i = 1;i <= n;i++)//检查匹配
    {
        sum[i] += sum[i-1];
        if(str[i] == '(')
            sum[i]++;
        if(str[i] == ')')
            sum[i]--;
    }
 
    bool out = false;
    for(int i = 2;i <= n;i++)
        if( c(level(str[i])) && c(level(str[i-1])) )
        {
            out = 1;
            break;
        }
 
    if( ( n==1 && c(level(str[1])) )||sum[n]||out )//表达式不合法
    {
        cout<<"NO"<<endl;
        return 0;
    }
 
    stack<int> s1;
    stack<char> s2;
    int temp = 0;
    bool flag = false;
    for(int i = 1 ;i <= n;i++)
    {
        if('0' <= str[i] && str[i] <= '9')//判断当前字符是否为数字
        {
            temp = (temp<<3)+(temp<<1)+str[i]-'0';
            flag = true;
        }
        else
        {
            if(flag)
            {
                s1.push(temp);
                temp = 0;
                flag = false;
            }
            if(str[i] == '(')
            {
                s2.push(str[i]);
                continue;
            }
            if(str[i] == ')')
            {
                while(s2.top()!='(')
                    calc(s1,s2);
                s2.pop();
                continue;
            }
            while(!s2.empty() && level(s2.top()) >= level(str[i]))//优先级判断
                calc(s1,s2);
            s2.push(str[i]);//运算符入栈
        }
    }
    if(flag)
    {
        s1.push(temp);
        temp = 0;
        flag = false;
    }
    while(!s2.empty())
        calc(s1,s2);
    cout << s1.top() << endl;
    return 0;
}

标签:1358,中缀,int,expr,s1,str,s2,push,表达式
From: https://blog.csdn.net/Richardlrx2010/article/details/139193579

相关文章

  • Node.js —— 前后端的身份认证 之用 express 实现 JWT 身份认证
    JWT的认识什么是JWT        JWT(英文全称:JSONWebToken)是目前最流行的跨域认证解决方案。JWT的工作原理        总结:用户的信息通过Token字符串的形式,保存在客户端浏览器中。服务器通过还原Token字符串的形式来认证用户的身份。  JWT的组成部分......
  • 【shell 】syntax error in conditional expression
    【shell】syntaxerrorinconditionalexpressionweixin_34050427于2016-04-1510:04:53发布阅读量3.6k 收藏 2点赞数1文章标签: shell版权编写shell脚本时遇见syntaxerrorinconditionalexpression错误,#!/bin/bash#cleanup/var/log/message......
  • nodejs + express + mysql + redis 基础功能实现
    nodejs+express+mysql+redis基础功能实现yeyue  9人赞同了该文章本文大体介绍了nodejs项目的创建、express框架的使用、mysql数据库的连接、以及redis的数据交互等方法,并举例了些简单的例子进行说明,代码都是亲自重头跑了一遍的,拿来可用。 一、......
  • DevExpress WinForms中文教程 - HTML & CSS支持的实战应用(二)
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!在这篇文章中,我们将概述使用DevExpressWinFormsH......
  • 界面组件DevExpress WPF v23.2新版亮点:富文本编辑器、电子表格组件升级
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。DevExpressWPF控件日前正式发布了近期的一个重大......
  • golang 类型断言和 var _ T = expression 写法
     类型断言(TypeAssertion)在Go语言中用于检查一个接口值的具体类型,并从中获取该类型的值。它允许你声明并访问接口变量内部存储的非接口类型的值。有两种主要的类型断言形式:value,ok:=i.(T):这种形式会检查接口i是否持有类型T的值。如果成功,value将是T类型的值,ok......
  • mysql: Syntax error or access violation: 1055 Expression #2 of SELECT (错误解决办
    Mysql报错:SQLSTATE[42000]:Syntaxerrororaccessviolation:1055Expression#2ofSELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn'seo.ryc_combo_class_cate_list_113.fid'whichisnotfunctionallydependentoncolumnsin......
  • nodejs中express搭建本地web服务器
    constexpress=require("express");constfs=require("fs");constpath=require("path");constapp=express();//读取当前目录中public文件中所有文件constdirectorPath=path.join(__dirname,"public");app.get("/&quo......
  • Hyperscan is generally vulnerable to regular expression denial of service (ReDoS
    FunctionsforSearchinginStrings|ClickHouseDocshttps://clickhouse.com/docs/en/sql-reference/functions/string-search-functionsHyperscanisgenerallyvulnerabletoregularexpressiondenialofservice(ReDoS)attacks(e.g.see(here)[https://www.usen......
  • 界面组件DevExpress WPF中文教程 - 如何从CRTX模板文件导入图表设置
    DevExpressWPF 拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中......