uva-327
题意:给出一个C语言加减法表达式,求出这个表达式的最终结构,以及各个变量的值,每个变量保证至出现一次,保证输入的字符串合法;
输入:一串包含+、-和小写的26个英文字母;
输出:表达式的结果,以及表达式中各变量的最终值;
解题思路:一个合法的C语言表达式,只包含空格、操作符(+、-)、变量(a-z);首先要处理前缀(+、-)和后缀(+、-)使表达式可以计算;在处理前缀和后缀问题时要注意前后缀与变量之间的空格,像表达式(++ a- --b +c --)是合法的;所以可以用两个数组(char int)模拟两个栈,分别用来存放操作符以及变量值,然后再用一个数组(int)来记录变量的前后缀以及变量是否在表达式里出现过。然后先考虑空格,再考虑变量(如果是变量则有可能后缀+、-),最后考虑操作符(如果是操作符则有可能前缀+、-);至此思路就清晰了。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<ctype.h>
#define MAXN 1000
using namespace std; int num[];//记录出现过的字符;
char str[MAXN];
char data1[MAXN];//记录操作符;
int data[MAXN];//记录变量值; int main(){
int n,i,len;
while(gets(str)){
for(i=;i<;i++)num[i]=-MAXN;
int cnt=,cnt1=,flag=;
len=strlen(str);
for(i=;i<len;i++){
if(str[i]==' ')continue;
else if(isalpha(str[i])){
flag=str[i]-'a'+;//标记有字符出现;
data[cnt++]=str[i]-'a'+;
num[str[i]-'a']=;
}
else {
if(str[i+]==str[i]){//连续两个操作符;
if(!flag){//没有字符出现的情况;
int j;
for(j=i+;j<len;j++)
if(isalpha(str[j]))break;
if(str[i]=='-'){
data[cnt++]=str[j]-'a';
num[str[j]-'a']=-;
}
else {
data[cnt++]=str[j]-'a'+;
num[str[j]-'a']=;
}
i=j;
}
else {//有字符出现的情况;
if(str[i]=='-')num[flag-]=-;
else num[flag-]=;
data[cnt]=flag;
i++;
}
}
else data1[cnt1++]=str[i];
flag=;//更新标志;
}
}
int sum=,t=,j=;
printf("Expression: %s\n",str);
for(i=;i<cnt;i++){
sum+=data[i]*t;
if(data1[j++]=='-')t=-;
else t=;
}
printf(" value = %d\n",sum);
for(int i=;i<;i++)
if(num[i]>=-)printf(" %c = %d\n",i+'a',+i+num[i]);
}
return ;
}
uva-327的更多相关文章
- uva 327 Evaluating Simple C Expressions 简易C表达式计算 stl模拟
由于没有括号,只有+,-,++,--,优先级简单,所以处理起来很简单. 题目要求计算表达式的值以及涉及到的变量的值. 我这题使用stl的string进行实现,随便进行练手,用string的erase删 ...
- UVA 327 -Evaluating Simple C Expressions(栈)
Evaluating Simple C Expressions The task in this problem is to evaluate a sequence of simple C expre ...
- uva 327 - Evaluating Simple C Expressions
Evaluating Simple C Expressions The task in this problem is to evaluate a sequence of simple C exp ...
- Fast Matrix Operations(UVA)11992
UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
- UVA数学入门训练Round1[6]
UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...
随机推荐
- C# IntPtr转换为Byte[]
[DllImport("OpenNetStream.dll")] public static extern int OpenSDK_Data_GetDevList(IntPtr s ...
- Android开源框架——Volley
Volley 是 Google 在 2013 I/O 大会上推出的 Android 异步网络请求框架和图片加载框架.特别适合数据量小,通信频繁的网络操作.Volley 主要是通过两种 Diapatch ...
- TCP数据包的封包和拆包
//该段博文为引用,非原创. 封包和拆包 作者:fengge8ylf 博客:http://blog.csdn.net/fengge8ylf 对于基于TCP开发的通讯程序,有个很重要的问题需要解决,就 ...
- 04 Apache Solr: 目录结构
通过前面的介绍,我们已经能够看到管理员界面并对Solr形成了一个感性的认识.本篇将在物理上深入了解Solr的安装目录结构和Solr示例的主目录结构. 安装目录结构 Solr 6.3.0安 ...
- 3个div 宽度移入移出时变化
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- iOS中坐标转换
坐标转换,可以用UIVIew的方法 //由要转换坐标view的superView执行该方法,rect为待转换view的frame,view是要显示到哪儿的 - (CGRect)convertRect: ...
- C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- HibernateTemplate的一些常用方法总结
1:get/load存取单条数据 public Teacher getTeacherById(Long id) { return (Teacher)this.hibernateTemplate.get ...
- 抽象工厂模式 shiyanlou
二.什么是 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种软件开发设计模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来.如果比较抽象工 ...
- libxml2 移植 arm9
准备工作: 1.libxml2软件版本:libxml2-2.6.32.tar.gz 2.交叉编译工具链:arm-none-linux-guneabi 软件安装: 1.设置环境变量: export PA ...