CT04字符串计算

合集下载

字符串的四则运算

字符串的四则运算

字符串的四则运算四则运算,最常⽤的当然是逆波兰⽅法,现将表达式由中缀表达式转化为后缀表达式,然后再使⽤栈计算即可。

这两步下来,估计没有三四百⾏代码是实现不了的。

中缀表达式转前缀后缀表达式将中缀表达式转换为后缀表达式的算法思想:数字时,加⼊后缀表达式;运算符:a. 若为 '(',⼊栈;b. 若为 ')',则依次把栈中的的运算符加⼊后缀表达式中,直到出现'(',从栈中删除'(' ;c. 若为除括号外的其他运算符,当其优先级⾼于除'('以外的栈顶运算符时,直接⼊栈。

否则从栈顶开始,依次弹出⽐当前处理的运算符优先级⾼和优先级相等的运算符,直到⼀个⽐它优先级低的或者遇到了⼀个左括号为⽌。

⾼优先级可以压迫低优先级!⼈⼯实现转换这⾥我给出⼀个中缀表达式:a+b*c-(d+e)第⼀步:按照运算符的优先级对所有的运算单位加括号:式⼦变成了:((a+(b*c))-(d+e))第⼆步:转换前缀与后缀表达式前缀:把运算符号移动到对应的括号前⾯,则变成了:-( +(a *(bc)) +(de)) ,把括号去掉:-+a*bc+de 前缀式⼦出现。

后缀:把运算符号移动到对应的括号后⾯,则变成了:((a(bc)* )+ (de)+ )- ,把括号去掉:abc*+de+- 后缀式⼦出现。

⽐如:计算(2 + 1) * (13 + 5)转换后得:((2+1)*(13+5)) -> ((2 1) + (13 5) +) * -> 2 1 + 13 5 + *这⾥把后缀表达式存储到vector<string>中,实现栈的计算,如下:int cal(int num1, int num2, string tag){if ("+" == tag){return num1 + num2;}else if ("-" == tag){return num1 - num2;}else if ("*" == tag){return num1*num2;}else{return num1 / num2;}}int evalRPN(vector<string> &tokens) {int result = 0;stack<int> nums;for (int i = 0; i<tokens.size(); i++){string tag = tokens[i];if (tag != "+"&&tag != "-"&&tag != "*"&&tag != "/"){//这是⼀个数字nums.push(atoi(tag.c_str()));}else{//不是⼀个数字int num2 = nums.top();nums.pop();int num1 = nums.top();nums.pop();result = cal(num1, num2, tag);nums.push(result);}}return result=nums.top();}实际中遇到的笔试题是这样的,有字符串表⽰的⼀个四则运算表达式,要求计算出该表达式的正确数值,⽐如:5+17*8-4/2。

算法 笔记]字符串表达式计算(简易版)

算法 笔记]字符串表达式计算(简易版)

题目:编写一个函数,计算字符串中表达式的值,参数中只包含计算符:+,-,*,/等。

例如,str=”10+50+2*6/3”,result=64。

解析:考虑算术表达式计算规则:1.同优先级操作符之间,从左到右计算;2.高优先级操作符的计算要早于低优先级操作符的计算;3.加减操作符优先级低于乘除操作符优先级;4.括号内的算术表达式的优先级高于括号外的乘除操作符的优先级。

调整后,操作符栈为:(op_stack,opr_top=1)…+‟…*‟当前,current_opr=‟*‟,top_opr=‟*‟,则priority(current_opr) == priority(top_opr),即符号第一种情况。

在编程中,对于“冒泡”处理有两种形式:1. 首先将元素压入栈中,然后通过交换的形式来达到“冒泡”处理。

1for ( i = opr_top - 1; i > 0; --i )2 {3if ( priority(op_stack[i]) < priority(op_stack[i-1]) )4 swap( op_stack, i, i - 1 );5else6break;7 }89for ( j = value_top - 1; j > i; --j )10 {11 swap( value_stack, j, j - 1 );12 }2. 不将数值压入栈中,而是首先查找符合要求的“位置”,然后将元素插入。

1for ( i = opr_top; i > 0; --i )2 {3if ( priority(op_stack[j-1]) > priority(current_opr) )4 op_stack[j] = op_stack[j-1];5else6break;7 }8 op_stack[i] = current_opr;9 ++opr_top;1011for ( j = value_top; j > i; --j )12 {13 value_stack[j] = value_stack[j - 1];14 }15 value_stack[j] = result;16 ++value_top;完整程序的源码:ComputeExpression简易版本不足之处:1.不能计算括号表达式2.对负数不能有效的处理3.不能有效计算大数4.对表达式中符号以及括号的合法性检查。

DS04_字符串

DS04_字符串

两个字符串相等 当且仅当两个串的长度相等, 两个字符串相等,当且仅当两个串的长度相等, 字符串相等, 并且各个对应位置的字符都相等.例如: 并且各个对应位置的字符都相等.例如: T1="REDROSE" T2=" ROSE" T1="REDROSE" T2="RED ROSE" 由于T1 T2的长度不相等 因此T1≠T2 T1和 的长度不相等, T1≠T2. 由于T1和T2的长度不相等,因此T1≠T2. 若 T3="STUDENT" T4="STUDENt" T3="STUDENT" T4="STUDENt" 虽然T3 T4的长度相等 T3和 的长度相等, 虽然T3和T4的长度相等,但两者有些对应的字符不 因而T3≠T4 T3≠T4. 同,因而T3≠T4. 值得一提的是, S=" 此时S 值得一提的是,若S=" ",此时S由一个空格字 符组成,其长度为1,它不等价于空串,因为空串的 符组成,其长度为1 它不等价于空串, 长度为0 长度为0.
五,串插入:strins(s1, 五,串插入:strins(s1,i,s2) (1)顺序存储方式串插入 (1)顺序存储方式串插入 int s_strins(s1,i,s2) /*串的第i个位置在数组中下标为i-1*/ s_strins(s1, /*串的第i个位置在数组中下标为i char s1[ ],s2[ ]; ], ]; int i; i; { int m,n.k; m, m=s_strlen(s1); m=s_strlen(s1); n=s_strlen(s2); n=s_strlen(s2); if (i<1 || i>m+1 || m+n>MAXN) return(1); return(1); /*位置i超界或空间不够,插入失败*/ /*位置i超界或空间不够,插入失败* for (k=m;k>=i-1;k- -) (k=m;k>=i/*移出n个位置*/ 移出n s1[k+n]=s1[k]; s1[k+n]=s1[k]; for(k=0; for(k=0;k<n;k++) s1[i+k-1]=s2[k]; s1[i+k-1]=s2[k]; return(0); return(0); /*插入成功*/ /*插入成功 }

c风格字符串操作与算法库简单运用

c风格字符串操作与算法库简单运用
这样不仅内容可以修改,指针也可以修改。
注意: 指向同一内容的指针,只要修改其中一个,
另一个也会改变。
完整版ppt
18
说完了字符串的指针操作,让我们看看数组
int a[]={1,2,3,4,5}; cout << a+1 << endl; cout << *(a+1) << endl; cout << &a[1] << endl; 这三句话的结果分别是什么? scanf(”%d”, &a[1]); scanf(”%d”, a + 1); 完整版这ppt 两句话一样吗?
完整版ppt
10 字符串的参数传递
如果函数内要修改字符串内容,编译能够通过。 但会根据内容是否为常量,在运行时报错。
完整版ppt
11 字符串的参数传递 传入类型 参数类型 字符数组 变量指针+变量内容 指针+内容 变量指针+内容(可不可变同前) 字符串常量 变量指针+常量内容
完整版ppt
12 strlen原理
完整版ppt
22
algorithm库有哪些函数呢?
sort, lower_bound, upper_bound, make_heap, push_heap, ……
函数太多(见附录),大家课后自己研究。
先来看一个简单的演示程序。
完整版ppt
23
到底有什么具体应用呢? 让我们先看一道题目吧。
完整版ppt
完整版ppt
15 交换两个字符串
交换指针? 我们知道数组名是不能交换的,能交换的只有
第二种指针+内容类型。
一次交换只需要3次赋值。 操作次数为3。

c语言字符串算法

c语言字符串算法

c语言字符串算法C语言中处理字符串的常用算法有很多,下面列举几个常见的例子:1. 字符串连接可以使用strcat函数将两个字符串连接起来。

strcat函数需要两个参数,第一个参数是目标字符串,第二个参数是源字符串。

strcat函数会将源字符串连接到目标字符串的末尾。

例如:```cchar str1[100] = "Hello";char str2[] = " World";strcat(str1, str2);printf("%s\n", str1); // 输出 "Hello World"```2. 字符串比较可以使用strcmp函数比较两个字符串是否相等。

strcmp函数需要两个参数,第一个参数是第一个字符串,第二个参数是第二个字符串。

strcmp函数返回0表示两个字符串相等,返回非0表示两个字符串不相等。

例如:```cchar str1[] = "Hello";char str2[] = "World";if (strcmp(str1, str2) == 0) {printf("The two strings are equal.\n");} else {printf("The two strings are not equal.\n");}```3. 字符串反转可以使用字符串反转函数将一个字符串反转。

可以使用循环遍历字符串中的每个字符,并将其与倒数第二个字符交换位置,直到遍历到字符串的开头为止。

例如:```cchar str[] = "Hello World";int len = strlen(str);for (int i = 0; i < len / 2; i++) {char temp = str[i];str[i] = str[len - i - 1];str[len - i - 1] = temp;}printf("%s\n", str); // 输出 "dlroW olleH" ```。

C#字符串计算表达式

C#字符串计算表达式

C#字符串计算表达式C# 字符串计算表达式string str="4+4+2.1";要的效果: double sum=4+4+2.1;⽅案⼀:动态计算表达式:1 public class Expression2 {3 object instance;4 MethodInfo method;5 /// <summary>6 ///表达试运算7 /// </summary>8 /// <param name="expression">表达试</param>9 public Expression(string expression)10 {11 if (expression.IndexOf("return") < 0) expression = "return " + expression + ";";12 string className = "Expression";13 string methodName = "Compute";14 CompilerParameters p = new CompilerParameters();15 p.GenerateInMemory = true;16 CompilerResults cr = new CSharpCodeProvider().CompileAssemblyFromSource(p, string.17 Format("using System;sealed class {0}{{public double {1}(double x){{{2}}}}}",18 className, methodName, expression));19 if (cr.Errors.Count > 0)20 {21 string msg = "Expression(\"" + expression + "\"): \n";22 foreach (CompilerError err in cr.Errors) msg += err.ToString() + "\n";23 throw new Exception(msg);24 }25 instance = piledAssembly.CreateInstance(className);26 method = instance.GetType().GetMethod(methodName);27 }28 /// <summary>29 ///处理数据30 /// </summary>31 /// <param name="x"></param>32 /// <returns>返回计算值</returns>33 public double Compute(double x)34 {35 return (double)method.Invoke(instance, new object[] { x });36 }View Code⽅案⼆:欢迎你们提供!。

字符串算法总结

字符串算法总结

字符串算法总结前⾔标题是骗你进来的,其实⾥⾯全是题⽬。

最近⼀直在搞字符串......把⼀些有代表性或者有⼀定难度的题放在这⾥做⼀个总结。

[CF666E] Forensic给你⼀个串S 以及⼀个字符串数组T [1..m ],q 次询问,每次问S 的⼦串S [p l ..p r ]在T [l ..r ]中的哪个串⾥的出现次数最多,并输出出现次数。

如有多解输出最靠前的那⼀个。

数据范围:|S |,∑|T |,q ≤105。

对T [1...m ]建⽴⼴义SAM ,⽤线段树合并维护出现次数。

每次查询先倍增到相应结点,然后直接线段树区间查询。

[NOI2011] 阿狸的打字机给定⼀个打字机,有加字符、删字符、打印三种操作。

给定操作序列S ,然后有Q 次询问,每次回答第x 次打印的串在第y 次打印的串中出现⼏次。

数据范围:|S |,Q ≤105⽤栈模拟建出所有打印串的Trie 树,然后构建AC ⾃动机与fail 树。

每次询问相当于问x 到Trie 的根这条路径上有多少个点能够跳fail 跳到y 。

对Trie 进⾏dfs ,⽤树状数组维护fail 树的⼦树和。

[BZOJ3670] 动物园给定⼀个串S ,求每⼀个前缀的不相交border 数。

数据范围:|S |≤107。

解法⼀:建出fail 树,然后dfs ⼀遍fail 树,⽤单调队列维护合法前缀⼤⼩。

解法⼆:先预处理出next 数组,然后类似next 数组的求法求答案,当不合法时跳next 数组。

[SCOI2013] 密码给定⼀个串的每个回⽂中⼼的扩展⼤⼩,构造满⾜条件的最⼩字典序串。

数据范围:n ≤105对这个串跑⼀遍manacher ,直接模拟即可,⽤并查集维护两个位置的字符是否相同。

最后使⽤最⼩表⽰法求出答案串。

[NOI2015] 品酒⼤会给定⼀个串S ,求∑i ∑i ≠j lcp (suf i ,suf j )。

数据范围|S |≤105。

使⽤后缀数组,按照Height 排序后合并后缀,⽤带权并查集维护答案。

excel 单元格字符串计算公式

excel 单元格字符串计算公式

标题:Excel单元格字符串计算公式在Excel中,字符串计算公式是一种非常重要的功能,它可以帮助用户对字符串进行一系列的计算和操作。

本文将从基本概念、常用函数、实际案例等方面进行介绍,帮助读者更好地理解和应用Excel中的字符串计算公式。

一、基本概念1.1 字符串在计算机术语中,字符串是由一系列字符组成的数据类型,通常用来表示文本信息。

在Excel中,我们可以将任意的字符、数字和符号组合在一起形成字符串,如“hello”,“123”,“#”等。

1.2 字符串计算字符串计算是指对字符串进行各种操作和计算,比如连接、截取、替换等。

在Excel中,我们可以通过一些特定的函数来实现对字符串的计算,从而满足不同的需求。

二、常用函数2.1 CONCATENATECONCATENATE函数可以将多个字符串连接在一起。

=CONCATENATE("Hello", "World")的计算结果为“HelloWorld”。

2.2 LEFTLEFT函数用于从左侧截取字符串的指定长度。

=LEFT("HelloWorld", 5)的计算结果为“Hello”。

2.3 RIGHTRIGHT函数用于从右侧截取字符串的指定长度。

=RIGHT("HelloWorld", 5)的计算结果为“World”。

2.4 LENLEN函数用于计算字符串的长度。

=LEN("HelloWorld")的计算结果为11。

2.5 MIDMID函数用于从字符串的指定位置开始截取指定长度的子字符串。

=MID("HelloWorld", 6, 5)的计算结果为“World”。

2.6 SUBSTITUTESUBSTITUTE函数用于替换字符串中指定的文本。

=SUBSTITUTE("HelloWorld", "Hello", "Hi")的计算结果为“HiWorld”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– 设金额是x分,输出时利用x/100和x%100分别 得到“元”和“角分”.
print “You have %d.%02d” % \ (x/100, x%100)
02d:不足2位用0填充 \:语句换行继续
文件处理
• 文件:存储在磁盘上的数据序列. • 典型的文件结构:
– 基本数据项:可为任何类型 – 若干数据项构成记录 – 若干记录构成文件
>>>”你好” >>>print “你好”
编程实例:编码与解码
• 编码
message=raw_input(“Enter the message to encode: “) for ch in message: print ord(ch),
• 解码
code = raw_input(“Enter the code of message: “) message = “” for numStr in string.split(code): num = eval(numStr) message = message + chr(num) print “The decoded message is:”,message
24
Lu Chaojun, SJTU
文件处理:关闭文件
• 关闭文件:取消文件变量与磁盘文件的关 联.
<filevar>.close() – 关闭文件时,系统会将内存中文件内容输出到 磁盘.
Lu Chaojun, SJTU
25
编程实例:批处理
• 通过文件实现成批数据的输入输出
– 这种情况不适合用交互方式输入
Lu Chaojun, SJTU
5
字符串操作:取字符
• 字符串是字符序列,可通过位置索引访问每个字 符.
<string>[<index-expr>] – 对长度为n的字符串,索引可以
是大于0的数:自左向右为0 ~ n−1, 或者 是负数:自右向左为−1, −2, −3,…, −n
– 例如:若str = “Hello Bob”,则
Lu Chaojun, SJTU
26
End
Lu Chaojun, SJTU
23
文件处理:读写文件
• 读文件:读出文件内容
<filevar>.read() <filevar>.readline() <filevar>.readlines() – 点表示法:文件是对象!
• 写文件:将新内容写入文件.
<filevar>.write(<string>) – 若想写多行内容,需写入\n
“hello world” ‘~!@#$%^&*’ “汉字也是字符”
• 字符串中包含引号怎么办?
– 包含单引号:串用双引号括住 – 包含双引号:串用单引号括住 – 两者都有:更一般的方法是串中用escape字符\ print “Alice said, \“Hello, ’Bob’\””
Lu Chaojun, SJTU
字符串库
• Python提供的string库包含了很多有用的 字符串处理函数 • 例如split():将字符串拆分成子串
string.split(“Hello string library!”)
返回结果:[‘Hello’,’string’,’library!’]
string.split(“32,24,25,57”,”,”)
• 例如:
– 学生基本数据项:学号,姓名,年龄 – 一个学生记录:{学号,姓名,年龄} – 文件:全体学生记录
Lu Chaojun, SJTU
21
文本文件
• 文件中是文本数据 • 文本文件可视为存储在磁盘上的字符串.
– 单行字符串 – 多行字符串
行尾(EOL):用特殊字符,如新行(newline)字符. Python用\n表示新行字符,该字符在显示时被解释 成新行字符.
infile = open(infileName, ’r’) outfile = open(outfileName, ’w’) for line in infile.readlines(): first, last = string.split(line) uname = string.lower(first[0]+last[:7]) outfile.write(uname+’\n’) infile.close() outfile.close()
• str()函数:将数值当作字符串
– 语法: str(<expr>) – 例如:str(3+4*5)
字符串的格式化输出
• 格式化运算符%
– 语法 <template-string> % (<values>) – 语义:模板串中用%标记“空位”,输出时用 实际值填入.
• 例如
print “The price is $%0.2f” % (100)
4
input与raw_input
• 例:比较
>>>x = input() “John” >>>x >>>x = input() 3*4+2 >>>x >>>x = raw_input() John >>>x >>>x = raw_input() 3*4+2 >>>x
• 可见raw_input()将输入当成字符串数 据.
• 一个字符串的重复
– 例如: 3*“Hi”和“Hi”*3都得到“HiHiHi”
• 串长度函数len()
编程实例:表查找
• 在一个数据表里查找目标
def main(): months=“JanFebMarAprMayJunJulAugSepOctNovDec” n = input(“Enter month number (1-12): ”) pos = (n-1)*3 monthAbbr = months[pos:pos+3] print “The month abbreviation is”,monthAbbr+”.”
– 这是简单查找:利用位置规律来定位.
例如:定长记录文件.
– 若是月份全称怎么办?
字符串的机内表示
• 与数值一样,计算机内用二进制数表示每一个字 符.
– 因此操作字符串本质上仍然是数值运算. – 表示字符的这个数值称为字符的编码.
这与密码通信的做法是一样的.
• 问题:计算机采用什么字符集?其中每个字符用 什么编码?
对浮点数用超长宽度会怎样?试试…
– 精度:指示浮点数值的小数位数.
省略:按系统默认的小数位数显示. print “%f” % (math.pi)
编程实例:浮点数如何精确化?
• 浮点数的机内表示是近似值. • 银行应用要求精确表示金额,故不宜用浮 点数及浮点运算. • 解决办法:以“分”为单位,用整数表示金 : , 额.
返回结果:[’32’,’24’,’25’,’57’]
字符串库(续)
• 一些常用函数
capitalize(s): 使s首字母大写 capwords(s): 使s的每个单词首字母大写 center(s,width), ljust(s,width), rjust(s,width): 使s变成width宽度且居中/ 左对齐/右对齐 count(s,sub): sub在s中出现次数 find(s,sub), rfind(s,sub): 在s中找sub的首次/末次出现 join(seq): 将串序列中的串合并成一个串,分隔符默认为空格 lower(s), upper(s): 将串变成小写/大写 lstrip(s), rstrip(s): 删除打头/收尾的空格 replace(s,oldsub,newsub): 在s中用新子串替换旧子串
格式描述
• 空位:格式指示符,描述了填入的值的输出形式.
%<width>.<precision><type-char> – 三种类型字符:decimal, float, string – 宽度:用多少位置显示数值.
省略或指定为0:根据值的实际长度显示. 宽度超出值的长度时:右对齐显示
宽度前加负号:左对齐.
字符串计算
文本数据
• 计算机应用从科学计算转向信息管理. • 信息管理中大量的数据都是文本数据.
– 如姓名,地址,简历等等 – 小问题:身份证号码,电话号码等是数值?
• 计算机中用字符串来表示文本数据.
Lu Chaojun, SJTU
2
字符串类型
• 字符串:字符序列 • 字符串字面值:用一对引号(单或双)标明.
3
字符串的输入
• 错误输入:
>>>str = input(“Enter a string: “) Enter a string: John
input() • 原因:input()是把输入当成表达式来计 算的! • 解决方法:
– 输入时加上引号 – 使用raw_input()
Lu Chaojun, SJTU
str[0:3]是‘Hel’ str[5:9]是‘ Bob’ str[:5]即str[0:5] str[5:]即str[5,9] str[:]即str[0:9]
字符串操作:连接
• 两字符串的连接
<string1> + <string2> – 例如: “Hello” + “Bob”得到“HelloBob”
str[0]或str[−9]是‘H’ str[5]或str[−4]是‘ ’ str[8]或str[−1]是‘b’ str[9]或str[−10]越界出错
相关文档
最新文档