/*
* POJ_3337.cpp
*
* Created on: 2013年10月29日
* Author: Administrator
*/ #include <iostream>
#include <cstdio>
#include <cstring> using namespace std; const int maxn = 10010;
int data[26];//用来存储每一个字母所对应的数字
char opr[maxn];//去掉空格后的表达式
char opr1[maxn];//去掉空格钱的表达式
bool vst[maxn];//用来标记某一个字符是否已经访问过 void init() {
int i;
for (i = 0; i < 26; ++i) {
data[i] = i + 1;
} memset(vst, 0, sizeof(vst));
}
int main() {
int ans;
int t;
int i, j;
scanf("%d", &t);
getchar();//调用gets()之前尽量加上这一句
while (t--) {
init();
ans = 0;
bool flag = false;
gets(opr1);
int len = strlen(opr1);
for (i = 0, j = 0; i < len; i++) { //去掉空格
if (opr1[i] != ' ') {
opr[j] = opr1[i];
j++;
}
}
for (i = 0; i < j; ++i) {
if (flag == false) { //6种情况
if (opr[i] >= 'a' && opr[i] <= 'z') { //如果是字母
if (i - 2 >= 0 && opr[i - 2] == '+' && opr[i - 1] == '+') { //++a
data[opr[i] - 'a']++;
ans = data[opr[i] - 'a'];
vst[opr[i] - 'a'] = true;
} else if (i - 2 >= 0 && opr[i - 2] == '-'
&& opr[i - 1] == '-') { //--a
data[opr[i] - 'a']--;
ans = data[opr[i] - 'a'];
vst[opr[i] - 'a'] = true;
} else if (opr[i + 2] == '+' && opr[i + 1] == '+') { //a++
ans = data[opr[i] - 'a']++;
vst[opr[i] - 'a'] = true;
} else if (opr[i + 2] == '-' && opr[i + 1] == '-') { //a--
ans = data[opr[i] - 'a']--;
vst[opr[i] - 'a'] = true;
} else if (opr[i - 1] == '-') { //-a
ans = -data[opr[i] - 'a'];
vst[opr[i] - 'a'] = true;
} else { //+a
ans = data[opr[i] - 'a'];
vst[opr[i] - 'a'] = true;
}
flag = true;
}
} else { //8种: b-++a b+--a b-a++ b-a-- b+a++ b+a-- -a +a
if (opr[i] >= 'a' && opr[i] <= 'z') {
if (i - 4 >= 0 && opr[i - 2] == '+' && opr[i - 1] == '+'
&& opr[i - 3] == '-') { //b-++a
ans = ans - (++data[opr[i] - 'a']);
vst[opr[i] - 'a'] = true;
} else if (i - 4 >= 0 && opr[i - 2] == '-'
&& opr[i - 1] == '-' && opr[i - 3] == '+') { //b+--a
ans = ans + (--data[opr[i] - 'a']);
vst[opr[i] - 'a'] = true;
} else if (opr[i + 1] == '+' && opr[i + 2] == '+') {
if (opr[i - 1] == '-') { //b-a++
ans = ans - data[opr[i] - 'a'];
data[opr[i] - 'a']++;
vst[opr[i] - 'a'] = true;
}
if (opr[i - 1] == '+') { //b+a++
ans = ans + data[opr[i] - 'a'];
data[opr[i] - 'a']++;
vst[opr[i] - 'a'] = true;
}
} else if (opr[i + 1] == '-' && opr[i + 2] == '-') {
if (opr[i - 1] == '+') { //b+a--
ans = ans + data[opr[i] - 'a'];
data[opr[i] - 'a']--;
vst[opr[i] - 'a'] = true;
}
if (opr[i - 1] == '-') { //b-a--
ans = ans - data[opr[i] - 'a'];
data[opr[i] - 'a']--;
vst[opr[i] - 'a'] = true;
}
} else if (opr[i - 1] == '-') { //-a
ans = ans - data[opr[i] - 'a'];
vst[opr[i] - 'a'] = true;
} else if (opr[i - 1] == '+') { //+a
ans = ans + data[opr[i] - 'a'];
vst[opr[i] - 'a'] = true;
}
}
}
} printf("Expression: %s\n", opr1);//注意这里输出的是opr1,而不是opr,因为opr已经被处理过
printf("value = %d\n", ans); for (i = 0; i < 26; ++i) {
if (vst[i]) {
printf("%c = %d\n", i + 'a', data[i]);
}
}
} return 0;
}

(字符串的处理4.7.22)POJ 3337 Expression Evaluator(解析C风格的字符串)的更多相关文章

  1. 经典算法面试题目-翻转一个C风格的字符串(1.2)

    题目: Write code to reverse a C-Style String. (C-String means that "abcd" is represented as ...

  2. POJ 3080 Blue Jeans (求最长公共字符串)

    POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...

  3. Qt平台下使用QJson解析和构建JSON字符串

    前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...

  4. java解析复杂的json字符串

    Java解析Json字符串--复杂对象(方法一)   { "name": "三班", "students": [ { "age&q ...

  5. .NET面试题解析(03)-string与字符串操作

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 字符串可以说是C#开发中最常用的类型了,也是对系统性能影响很关键的类型,熟练掌握字符串的操作非常重要. 常 ...

  6. Dom4j解析xml格式的字符串【java】

    一般我们会使用dom4j.SAX.w3c来解析xml文件,网上也大多提供此类解决方案. 但在实际项目中,也有会解析xml格式的字符串报文的. 比如,有如下字符串: String = "< ...

  7. C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段

    C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...

  8. C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化

      一.字符串输入输出函数 1.  cin.get()   逐个字符输入输出 2.  cin 可以将整个字符串一次性输入,但是,cin将空格.Tab和回车键,因此不能用于数组的一次性输入. 注意:ci ...

  9. String 类中的几个练习--获取指定字符串中,大写字母、小写字母、数字的个数||获取一个字符串中,另一个字符串出现的次数

    package cn.homework.demo1; public class GetCount { /* * 获取一个字符串中,另一个字符串出现的次数 * 思想: * 1. indexOf到字符串中 ...

随机推荐

  1. BZOJ 1192 鬼谷子的钱袋 数论

    1192:鬼谷子的钱袋 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1926  Solved: 1417 题目连接 http://www.lydsy ...

  2. asp.net 判断日期是否为空

    if (Birthday == DateTime.MinValue) { //u can do something here } 首先确保Birthday是不可为null的日期类型.如果可为null就 ...

  3. 【原】MySQL实用SQL积累

    [文档简述] 本文档用来记录一些常用的SQL语句,以达到快速查询的目的. [常用SQL] 1.mysql数据库中获取某个表的所有字段名 select COLUMN_NAME from informat ...

  4. python类型比较的3种方式(转)

    通过types模块的类成员来判断,其实所有python中的类型都是这个types模块中类型的实例. import types type(x) is types.IntType # 判断是否int 类型 ...

  5. HTTP协议中 POST和GET的区别

    http://blog.csdn.net/whuslei/article/details/6667095 权威点的说明请参考:http://www.cs.tut.fi/~jkorpela/forms/ ...

  6. js 日期相差的天数

    function DateDiff(sDate1, sDate2){ //sDate1和sDate2是2006-12-18格式 var aDate, oDate1, oDate2, iDays aDa ...

  7. Unity3d通用工具类之数据配置加载类-ini配置文件加载

    Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...

  8. 《Windows核心编程》第九章——用内核对象进行线程同步

    先举一个有bug的例子: #include <iostream> #include <windows.h> #include <process.h> using n ...

  9. python urlopen SSL: CERTIFICATE_VERIFY_FAILED

    1.使用ssl创建未经验证的上下文,在urlopen中传入上下文参数 import sslimport urllib2 context = ssl._create_unverified_context ...

  10. Asp.Net中自以为是的Encode

    Asp.Net 引擎可能是不错,但是它把程序员想的太笨,会自以为是做很多自动的 Encode 和 Decode,以下文举例: 如果客户端我们 post 了如下的数据, 但是你实际得到的是: 也就是说, ...