(字符串的处理4.7.22)POJ 3337 Expression Evaluator(解析C风格的字符串)
/*
* 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风格的字符串)的更多相关文章
- 经典算法面试题目-翻转一个C风格的字符串(1.2)
		
题目: Write code to reverse a C-Style String. (C-String means that "abcd" is represented as ...
 - POJ 3080 Blue Jeans (求最长公共字符串)
		
POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...
 - Qt平台下使用QJson解析和构建JSON字符串
		
前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...
 - java解析复杂的json字符串
		
Java解析Json字符串--复杂对象(方法一) { "name": "三班", "students": [ { "age&q ...
 - .NET面试题解析(03)-string与字符串操作
		
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 字符串可以说是C#开发中最常用的类型了,也是对系统性能影响很关键的类型,熟练掌握字符串的操作非常重要. 常 ...
 - Dom4j解析xml格式的字符串【java】
		
一般我们会使用dom4j.SAX.w3c来解析xml文件,网上也大多提供此类解决方案. 但在实际项目中,也有会解析xml格式的字符串报文的. 比如,有如下字符串: String = "< ...
 - C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段
		
C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...
 - C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化
		
一.字符串输入输出函数 1. cin.get() 逐个字符输入输出 2. cin 可以将整个字符串一次性输入,但是,cin将空格.Tab和回车键,因此不能用于数组的一次性输入. 注意:ci ...
 - String 类中的几个练习--获取指定字符串中,大写字母、小写字母、数字的个数||获取一个字符串中,另一个字符串出现的次数
		
package cn.homework.demo1; public class GetCount { /* * 获取一个字符串中,另一个字符串出现的次数 * 思想: * 1. indexOf到字符串中 ...
 
随机推荐
- Go语言Web框架gwk介绍 (二)
			
HttpResult 凡是实现了HttpResult接口的对象,都可以作为gwk返回Web客户端的内容.HttpResult接口定义非常简单,只有一个方法: type HttpResult inter ...
 - 推荐一个简洁优雅的博客系统,farbox
			
这是我用farbox搞的一个博客:http://www.jsnull.com/ 特点: 1.无数据库,数据存在dropbox里,需要自己注册一个dropbox帐号 2.静态文本文件即是文章,可以在任何 ...
 - windows命令行快捷操作
			
net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user: ...
 - struts2对拦截器使用带实例
			
拦截器是struts2的核心.拦截器可以拦截请求,控制视图的走向.那么怎么来实现自定义的拦截器呢? 这里我们做一个例子. 首先假现在做了两个jsp页面一个是登陆的信息的(用session来模拟),一个 ...
 - java开发C语言编译器
			
http://study.163.com/course/introduction.htm?courseId=1003169025 http://study.163.com/course/courseM ...
 - HDU4548+筛素数
			
先筛出素数,再筛出美素数. 简单题. /* 筛素数 */ #include<stdio.h> #include<string.h> #include<stdlib.h&g ...
 - authentication not supported Connect to TFS Git from Xamarin Studio (non-hosted, locally installed TFS 2013)
			
There are several instructions on how to connect to TFS Git from Xamarin Studio if you're using the ...
 - 1、Cocos2dx 3.0游戏开发找小三之前言篇
			
尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...
 - SVN环境
			
SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...
 - Linux 防火墙 iptables基本操作
			
1:临时性关闭开启防火墙,重启后失效开启service iptables start关闭service iptables stop/etc/rc.d/init.d/iptables stop 2:永久 ...