(字符串的处理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到字符串中 ...
随机推荐
- BZOJ 4726 POI 2017 Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- RAD Studio 2010~XE8 官方 ISO 下载地址 (2015-03-28更新)
http://bbs.csdn.net/topics/390816856 RAD Studio XE8 目前最新版 v22.0.19027.8951 官方 ISO 文件下载(6.72GB):http: ...
- Android 官方文档:(一)动画和图像 —— 1.5 画布和画图
The Android framework APIs provides a set 2D drawing APIs that allow you to render your owncustom gr ...
- 微软正式发布VS2015和.Net为开发者提供数百个新功能
今天,我很高兴地向大家宣布:Visual Studio 2015 和 .Net 4.6 的正式版本现已提供下载! 自去年十一月我们提出了微软开发技术的愿景:让所有开发者,无论他在什么平台,开发哪种应用 ...
- fundamentals5
PROTOBUF的DELPHI开源框架fundamentals5 GITHUB: https://github.com/fundamentalslib/fundamentals5 # Fundamen ...
- UI----------------Toggle
Is On:是否已经勾选上了 Toggle Transition:渐变效果 Graphic:勾选标志的图,就是那个勾 Group:多选组 On Value Changed:当选项改变时,触发事件 多选 ...
- 禁用IE缓存
HTTP消息报头包括普通报头.请求报头.响应报头.实体报头. 普通报头中的Cache-Control用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的 ...
- 算法:插入排序(Insertion Sort)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- jquery 根据name获取元素的问题
我要获取name属性为test的元素 但是这个test是赋值给变量的 如var name='test'; 即要获取name属性为变量name的元素 请问jquery怎么写? $("input ...