题意:

给你一个带括号、加减、乘的表达式,和n个数$(n\leq 5)$,问你带入这几个数可不可能等于n

思路:

先处理表达式:先将中缀式转化为逆波兰表达式

转换过程需要用到栈,具体过程如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" )"的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。

然后用n个数的全排列代入,注意全排列函数next_permutation的使用方式,用do-while避免了漏第一个排列的情况,用之前要先sort

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 5e6+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);
int a[];
int top;
char s[maxn];
stack<char>num, op;
bool isnum(char c){
if(c>='a' && c <='z') return true;
return false;
}
bool rk(char a, char b){
if(a == '*' && (b == '+' || b == '-') ) return true;
return false;
} char tmp[maxn]; int fun(){
int ind = ;
stack<int>stt;
for(int i = ; i < top; i++){
if(isnum(tmp[i])){
stt.push(a[ind++]);
}
else{
int t1 = stt.top();
stt.pop();
int t2 = stt.top();
stt.pop();
if(tmp[i]=='+')stt.push(t1+t2);
if(tmp[i]=='-')stt.push(t1-t2);
if(tmp[i]=='*')stt.push(t1*t2);
}
}
return stt.top();
} int main(){
int n;
while(~scanf("%d", &n)){
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
}
sort(a+, a++n);
int v;
scanf("%d", &v);
if(n==&&v==)break;
getchar();
scanf("%s", s);
int m = strlen(s);
set<char>ss;
vector<char>wzs;
top = ;
for(int i = ; i < m; i++){
if(isnum(s[i])){
if(ss.find(s[i])==ss.end()){
ss.insert(s[i]);
wzs.pb(s[i]);
} tmp[top++] = s[i];
continue;
}
if(s[i]=='('){
op.push(s[i]);
continue;
}
if(s[i]==')'){
while(op.top()!='('){
tmp[top++] = op.top();
op.pop();
}
op.pop();
continue;
}
if(s[i]=='*'||s[i]=='+'||s[i]=='-'){
while(!(op.empty()||op.top()=='('||rk(s[i], op.top()))){
tmp[top++] = op.top();
op.pop();
}
if((op.empty()||op.top()=='('||rk(s[i], op.top()))){
op.push(s[i]);
}
} }
sort(a+, a+n+);
int flg = ;
do{
if(fun()==v){
flg = ;
printf("YES\n");
break;
}
}while(next_permutation(a+, a+n+));
if(!flg)printf("NO\n");
}
return ;
}

HDU4192 Guess the Numbers(表达式计算、栈)的更多相关文章

  1. 栈应用之 后缀表达式计算 (python 版)

    栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1.  中缀表达式.前缀表达式.后缀表达式区别  中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...

  2. 蓝桥杯 ALGO-156 表达式计算 JAVA代码 栈的应用

     算法训练 表达式计算   时间限制:1.0s   内存限制:256.0MB      问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个 ...

  3. C# - 二叉树表达式计算

    很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...

  4. C++实现 逆波兰表达式计算问题

    C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...

  5. 算法笔记_044:表达式计算求值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ...

  6. CH1802 表达式计算4

    题意 给出一个表达式,其中运算符仅包含+,-,*,/,^(加 减 乘 整除 乘方)要求求出表达式的最终值 数据可能会出现括号情况,还有可能出现多余括号情况 数据保证不会出现>=2^31的答案 数 ...

  7. Java实现表达式计算求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  8. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

  9. C#动态表达式计算

    C#动态表达式计算 应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行 ...

随机推荐

  1. 使用Eureka中遇到的一些问题

    1.情况 :   服务已经注册到eureka,eureka中可以看到,但是 consumer和provider这两个服务,一直报错, 错误信息:DiscoveryClient_CONSUMER-DEM ...

  2. 【一起学源码-微服务】Feign 源码三:Feign结合Ribbon实现负载均衡的原理分析

    前言 前情回顾 上一讲我们已经知道了Feign的工作原理其实是在项目启动的时候,通过JDK动态代理为每个FeignClinent生成一个动态代理. 动态代理的数据结构是:ReflectiveFeign ...

  3. DZNEmptyDataSet框架阅读

      前段时间使用公司封装的空白页占位视图工具,工具是对DZNEmptyDataSet框架的封装.这个框架以前在许多项目也都用过,却没有认真阅读过源码,真的很遗憾.这两天趁五一放假有空,将DZNEmpt ...

  4. 【Java基础总结】多线程

    1. 实现多线程的两种方式 //第一种:继承Thread类,重写run()方法 class ThreadTest1 extends Thread{ public void run(){ String ...

  5. Python - 线性回归(Linear Regression) 的 Python 实现

    背景 学习 Linear Regression in Python – Real Python,前面几篇文章分别讲了"regression怎么理解","线性回归怎么理解& ...

  6. Map2Shp软件字符编码解决方案——彻底杜绝Shape格式乱码

    在使用Shape文件时,如果里面有中文属性信息时,经常会遇到属性信息变为乱码.尤其是ArcGIS10.2.1之后,Esri改变了软件的默认字符编码规则,打开之前保存的Shapefile文件,总会不时遇 ...

  7. 【转】.NET 在云原生时代的蜕变,让我在云时代脱颖而出

    原创:张善友 原文:https://www.cnblogs.com/shanyou/p/12198741.html .NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展.有了开 ...

  8. 关于爬虫的日常复习(3)—— request库

  9. HBase二次开发之搭建HBase调试环境,如何远程debug HBase源代码

    版本 HDP:3.0.1.0 HBase:2.0.0 一.前言 之前的文章也提到过,最近工作中需要对HBase进行二次开发(参照HBase的AES加密方法,为HBase增加SMS4数据加密类型).研究 ...

  10. 推荐几个高质量图片网站,再也不怕没图装X了

    这几个图片网站都是高质量的图片网站,建议收藏! 找个高逼格的图片发票圈,不再难了. Unsplash 网址:https://unsplash.com Unsplash是一个免费高质量照片的网站,照片都 ...