/*
* 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. Atlas 安装运行随笔

    Atlas 是一个用于数据库负载均衡 ,读写分离的中间件,他实现了mysql 的语法,对于普通调用DAL 层来说的话,和mysql 是一样的. 一,安装1,从源码安装 , 可以参考 http://bl ...

  2. LAMP架构之NFS

    需求分析: 前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器: 虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台Web服务 ...

  3. High Voltage Boost Supply

    http://learn.adafruit.com/ice-tube-clock-kit/design Tubes such as VFDs, Nixies, Decatrons, etc requi ...

  4. window server 2012 更改密钥 更改系统序列号

    由于在window server 2012当中,好像更改密钥的方法,给隐藏了,没办法激活,这里记录一下在网上查找到的一个命令行,如何在window server 2012 更改密钥 更改系统序列号 在 ...

  5. datagrid在MVC中的运用05-加入时间搜索条件,枚举填充下拉框

    本文主要来体验在搜索区域增加更多的搜索条件,主要包括: ※ 使用jQuery ui的datepicker显示时间,设置显示格式.样式. ※ 设置jQuery ui的onClose事件,使开始和结束时间 ...

  6. 用宏判断程序当前的运行模式(debug or release)

    例子 #if defined (DEBUG) && DEBUG == 1 // 如果当前处于debug 模式 //to do #else //to do #endif 

  7. 使用开源库 SDWebImage 异步下载缓存图片(持续更新)

    source  https://github.com/rs/SDWebImage APIdoc  http://hackemist.com/SDWebImage/doc Asynchronous im ...

  8. jquery的each函数的用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. strstr实现

    // strstr.c查找完全匹配的子字符串 #include<stdio.h> #include<string.h> char *my_strstr(const char * ...

  10. 混沌数学之Standard模型

    相关软件混沌数学之离散点集图形DEMO 相关代码: class StandardEquation : public DiscreteEquation { public: StandardEquatio ...