当前位置:文档之家› 试写一个判别表达式中开,闭括号(即圆括号,方括号)是否配对出现的算法(链表)

试写一个判别表达式中开,闭括号(即圆括号,方括号)是否配对出现的算法(链表)

试写一个判别表达式中开,闭括号(即圆括号,方括号)是否配对出现的算法(链表)
试写一个判别表达式中开,闭括号(即圆括号,方括号)是否配对出现的算法(链表)

#include

#include

#include

#define STACK_INIT_SIZE 10

#define STACK_GROW_SIZE 5

#define ELEMTYPE char

#define OK 1

#define ERROR 0

typedef struct { /*建立一个栈的首结点*/

ELEMTYPE * base;

ELEMTYPE * top;

int stacksize;

} SpStack;

int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/

s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));

if (!s->base) return ERROR;

s->top=s->base;

s->stacksize=STACK_INIT_SIZE;

return OK;

}

int StackEmpty(SpStack *s) { /*判断栈是否为空*/

if (s->top==s->base) return OK;

else return ERROR;

}

int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/

if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/

s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTY PE)));

if (!s->base) return ERROR;

s->stacksize+=STACK_GROW_SIZE;

s->top=s->base+s->stacksize;

}

*s->top++=e;

return OK;

}

int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/

if (StackEmpty(s)) return ERROR;

*e=*(--s->top);

return OK;

}

int Comp(ELEMTYPE a,ELEMTYPE b) {

if ((a=='('&&b!=')')

||(a=='['&&b!=']')) {

return ERROR;

} else return OK;

}

int Count(SpStack *s) {

ELEMTYPE e[STACK_INIT_SIZE*2];

ELEMTYPE e1;

int i;

InitStack(s);

fgets(e,STACK_INIT_SIZE*2,stdin);

if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;

printf("%s\n",e);

for (i=0;e[i]!='\0';i++) {

switch (e[i]) {

case '(':

case '[':

Push(s,e[i]);

break;

case ')':

case ']':

if (StackEmpty(s)) {

printf("%*s右括号多余\n",i+1,"");

return(ERROR);

} else Pop(s,&e1);

if (!Comp(e1,e[i])) {

printf("%*s左右匹配出错\n",i+1,"");

return(ERROR);

}

}

}

if (!StackEmpty(s)) {

printf("%*s左括号多余\n",i,"");

return(ERROR);

} else {

printf("匹配正确\n");

return(OK);

}

}

void main() {

SpStack s;

Count(&s);

free(s.base);

}

数据结构课程设计---括号匹配

目录 1 问题描述 (2) 1.1题目 (2) 1.2问题 (2) 1.3要求 (2) 2 设计 (2) 2.1存储结构设计 (2) 2.2主要算法设计 (3) 2.3测试用例及测试结果 (6) 3 调试报告 (9) 4 对设计和编码的讨论和分析 (20) 4.1设计 (20) 4.2对编码的讨论 (21) 5 总结和体会 (22) 附录一 (24) 本科生课程设计成绩评定表................... 错误!未定义书签。

数据结构课程设计 ——判别括号配对 1问题描述 1.1题目: 判别括号配对 1.2问题: 一个算术表达式含圆括号、中括号、花括号,且它们可任意嵌套使用。写一程序,判断任一算术表达式中所含括号是否正确配对。 1.3要求: (1)表达式从键盘输入。 (2)利用栈求解此问题。 (3)测试用例自己设计。 2设计 2.1存储结构设计 题目要求利用栈来求解此问题,因此选择顺序栈作为存储结构,具体表示如下: #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10

char *base; char *top; int stacksize; }SqStack; 2.2主要算法设计 2.2.1算法思想 (1)文字描述 从键盘输入一个表达式; 逐个扫描表达式中的字符; 当遇到左括号时,将左括号入栈; 继续扫描,将此后遇到的第一个右括号与栈顶元素比较,若匹配,则栈顶元素出栈;否则,继续扫描; 当整个表达式扫描完以后,判断栈内是否还有元素,若有,则括号不匹配; 若栈为空,则括号配对成功; 在括号配对不成功的情况下,利用栈顶栈底元素的差值,可以对左右括号数进行比较。(2)流程图表示

正则表达式

1.验证用户名和密码:("^[a-zA-Z]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位; 2.验证电话号码:("^(\d{3,4}-)\d{7,8}$")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx; 3.验证手机号码:"^1[3|4|5|7|8][0-9]\\d{8}$"; 4.验证身份证号(15位或18位数字):"\d{14}[[0-9],0-9xX]"; 5.验证Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"); 6.只能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9]+$"); 7.整数或者小数:^[0-9]+([.][0-9]+){0,1}$ 8.只能输入数字:"^[0-9]*$"。 9.只能输入n位的数字:"^\d{n}$"。 10.只能输入至少n位的数字:"^\d{n,}$"。 11.只能输入m~n位的数字:"^\d{m,n}$"。 12.只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。 13.只能输入有两位小数的正实数:"^[0-9]+(\.[0-9]{2})?$"。 14.只能输入有1~3位小数的正实数:"^[0-9]+(\.[0-9]{1,3})?$"。 15.只能输入非零的正整数:"^\+?[1-9][0-9]*$"。 16.只能输入非零的负整数:"^\-[1-9][0-9]*$"。 17.只能输入长度为3的字符:"^.{3}$"。 18.只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。 19.只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。 20.只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。 21.验证是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。 22.只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"。 23.验证URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。 24.验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"10"~"12"。 25.验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"、"10"~"29"和“30”~“31”。 26.获取日期正则表达式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日? 评注:可用来匹配大多数年月日信息。 27.匹配双字节字符(包括汉字在内):[^\x00-\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 28.匹配空白行的正则表达式:\n\s*\r 评注:可以用来删除空白行 29.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 30.匹配首尾空白字符的正则表达式:^\s*|\s*$

数据结构实验 表达式括号匹配配对判断问题概览

实验表达式括号匹配配对判断问题 姓名:班级: 学号:实验时间: 1.问题描述 一个算术表达式含圆括号、中括号、花括号,且它们可任意嵌套使用。写一程序,判断任一算术表达式中所含括号是否正确配对。 2.数据结构设计 匹配判别发生在右括号出现时,且被匹配的左括号应是距离右括号最近被输入的,二不是最先被输入的括号 ,即“先入后匹配”。因此用栈来解决。 #define stacksize 100 //定义栈的空间大小 struct stack{ //定义栈的结构体 char strstack[stacksize];//定义栈的存储格式为字符型 int top; //定义栈的栈顶变量 }; void InitStack(stack &s) {//定义一个新栈s,初始化栈顶为-1 s.top = -1; }

3.算法设计 (1)入栈的算法 char Push(stack &s, char a) { //入栈操作,将字符a入栈s if(s.top == stacksize - 1) //当栈顶为栈的空间大小-1,栈满return 0; s.top ++;//入栈操作一次,栈顶+1 s.strstack[s.top] = a;//此时,栈顶元素为字符a return a; } (2)出栈的算法设计 char Pop(stack &s ) { //出栈操作 if(s.top == -1) //当栈顶为-1时,栈空 return 0; char a = s.strstack[s.top];//将栈顶元素赋予字符a,并返回字符a,完成出栈操作 s.top--; return a;

正则表达式

本文分十四个类别对正则表达式的意义进行了解释,这十四各类别是:字符/字符类/预定义字符类/POSIX字符类/https://www.doczj.com/doc/1718182317.html,ng.Character类/Unicode块和类别的类/边界匹配器/Greedy数量词/Reluctant数量词/Possessive数量词/Logical运算符/Back引用/引用/特殊构造。 1.1.字符 x 字符 x。例如a表示字符a \\ 反斜线字符。在书写时要写为\\\\。(注意:因为java在第一次解析时把\\\\解析成正则表达式\\,在第二次解析时再解析为\,所以凡是不是1.1列举到的转义字符,包括1.1的\\,而又带有\的都要写两次) \0n 带有八进制值 0的字符 n (0 <= n <= 7) \0nn 带有八进制值 0的字符 nn (0 <= n <= 7) \0mnn 带有八进制值 0的字符 mnn(0 <= m <= 3、0 <= n <= 7) \xhh 带有十六进制值 0x的字符 hh \uhhhh 带有十六进制值 0x的字符 hhhh \t 制表符 ('\u0009') \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') \f 换页符 ('\u000C') \a 报警 (bell) 符 ('\u0007') \e 转义符 ('\u001B') \cx 对应于 x 的控制符 1.2.字符类 [abc] a、b或 c(简单类)。例如[egd]表示包含有字符e、g或d。 [^abc] 任何字符,除了 a、b或 c(否定)。例如[^egd]表示不包含字符e、g或d。 [a-zA-Z] a到 z或 A到 Z,两头的字母包括在内(范围) [a-d[m-p]] a到 d或 m到 p:[a-dm-p](并集) [a-z&&[def]] d、e或 f(交集) [a-z&&[^bc]] a到 z,除了 b和 c:[ad-z](减去) [a-z&&[^m-p]] a到 z,而非 m到 p:[a-lq-z](减去) 1.3.预定义字符类(注意反斜杠要写两次,例如\d写为\\d) . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] 1.4.POSIX 字符类(仅 US-ASCII)(注意反斜杠要写两次,例如\p{Lower}写为\\p{Lower})

模式匹配KMP算法实验报告

实验四:KMP算法实验报告 一、问题描述 模式匹配两个串。 二、设计思想 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KM P算法。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为a bcdef这样的,大没有回溯的必要。 改进的地方也就是这里,我们从T串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。 如果不用回溯,那T串下一个位置从哪里开始呢? 还是上面那个例子,T为ababc,如果c失配,那就可以往前移到aba最后一个a的位置,像这样:

数据结构实验报告(栈_括号匹配) (1)

数据结构课程设计报告 设计题目:括号匹配 院系计算机学院 年级11 级 学生刘云飞 学号E01114295 指导教师王爱平 起止时间9-7/9-14

课程设计目的 1.熟悉并写出栈的逻辑结构表示 2.实现栈的存储表示 3.实现栈的操作 内容 括号匹配 课程设计要求 1.在实验报告中写出栈的ADT表示; 2.在实验报告中给出数据类型定义和核心算法和程序; 3.在实验报告中罗列实验过程中出现的问题和解决的方法; 4.打包上交调试后的完整程序,提交实验报告; 5.实验之前写出实验报告的大概框架,实验过程中填写完整。 6.实验时携带需要上机调试的程序; 7.实验评分:实验之前预习占20%,实验报告书写情况占50%,运行情况30%。概要设计 1.栈的ADT表示 ADT Stack{ 数据对象:D={ai|ai∈ ElemSet,i=1,2,…,n,n>=0} 数据关系:R1={|ai-1,ai ∈D,i=2,…,n} 约定an为栈顶端,a1为栈底端 基本操作: Status InitStack(&s) 操作结果:构造一个空栈s。 Status Push( &s, e) 初始条件:栈s已经存在。 操作结果:插入元素e为新的栈顶元素。 Status Pop( &s, &e) 初始条件:栈s已经存在,并不为空。 操作结果:删除s的栈顶元素,并用e返回其值。 Status Check( &s, e) 初始条件:栈s已经存在,并不为空。 操作结果:判断括号是否匹配。 Status EnterString( &s) }ADT Stack 2.数据类型定义和核心算法和程序 数据类型定义: typedef int Status;

串的模式匹配算法实验报告

竭诚为您提供优质文档/双击可除串的模式匹配算法实验报告 篇一:串的模式匹配算法 串的匹配算法——bruteForce(bF)算法 匹配模式的定义 设有主串s和子串T,子串T的定位就是要在主串s中找到一个与子串T相等的子串。通常把主串s称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串T;不成功则指目标串s中不存在模式串T。bF算法 brute-Force算法简称为bF算法,其基本思路是:从目标串s的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串s的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串s中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下:

/*返回子串T在主串s中第pos个字符之后的位置。若不存在,则函数返回值为0./*T非空。 intindex(strings,stringT,intpos) { inti=pos;//用于主串s中当前位置下标,若pos不为1则从pos位置开始匹配intj=1;//j用于子串T中当前位置下标值while(i j=1; } if(j>T[0]) returni-T[0]; else return0; } } bF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是o(n+m).

数据结构课程设计题目

“数据结构”课程设计题目 1、城市链表(3) [问题描述] 将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。 [基本要求] (1)给定一个城市名,返回其位置坐标; (2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。 [测试数据] 由学生依据软件工程的测试技术自己确定。注意测试边界数据。 2、约瑟夫生死者游戏(3) [问题描述] 约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 [基本要求] 利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 [测试数据] m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。 [实现提示] 程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码。设n≤30。 [选作内容] 向上述程序中添加在顺序结构上实现的部分。 3、括号匹配的检验(3) [问题描述] 假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或[([ ] [ ])]等为正确格式,[( ])或(((]均为不正确的格式。检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。例如:考虑下列的括号序列:

字符串匹配算法总结

Brute Force(BF或蛮力搜索) 算法: 这是世界上最简单的算法了。 首先将匹配串和模式串左对齐,然后从左向右一个一个进行比较,如果不成功则模式串向右移动一个单位。 速度最慢。 那么,怎么改进呢? 我们注意到Brute Force 算法是每次移动一个单位,一个一个单位移动显然太慢,是不是可以找到一些办法,让每次能够让模式串多移动一些位置呢? 当然是可以的。 我们也注意到,Brute Force 是很不intelligent 的,每次匹配不成功的时候,前面匹配成功的信息都被当作废物丢弃了,当然,就如现在的变废为宝一样,我们也同样可以将前面匹配成功的信息利用起来,极大地减少计算机的处理时间,节省成本。^_^ 注意,蛮力搜索算法虽然速度慢,但其很通用,文章最后会有一些更多的关于蛮力搜索的信息。 KMP算法 首先介绍的就是KMP 算法。 这个算法实在是太有名了,大学上的算法课程除了最笨的Brute Force 算法,然后就介绍了KMP 算法。也难怪,呵呵。谁让Knuth D.E. 这么world famous 呢,不仅拿了图灵奖,而且还写出了计算机界的Bible (业内人士一般简称TAOCP). 稍稍提一下,有个叫H.A.Simon的家伙,不仅拿了Turing Award ,顺手拿了个Nobel Economics Award ,做了AI 的爸爸,还是Chicago Univ的Politics PhD ,可谓全才。 KMP 的思想是这样的: 利用不匹配字符的前面那一段字符的最长前后缀来尽可能地跳过最大的距离 比如 模式串ababac这个时候我们发现在c 处不匹配,然后我们看c 前面那串字符串的最大相等前后缀,然后再来移动 下面的两个都是模式串,没有写出来匹配串 原始位置ababa c 移动之后aba bac 因为后缀是已经匹配了的,而前缀和后缀是相等的,所以直接把前缀移动到原来后缀处,再从原来的c 处,也就是现在的第二个b 处进行比较。这就是KMP 。 Horspool算法。 当然,有市场就有竞争,字符串匹配这么大一个市场,不可能让BF 和KMP 全部占了,于是又出现了几个强劲的对手。

数据结构课程设计题

“数据结构”课程设计题目 1、城市链表 [问题描述] 将若干城市的信息,存入一个带头结点的单链表。结点中的城市信息包括:城市名,城市的位置坐标。要求能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。 [基本要求] (1)给定一个城市名,返回其位置坐标; (2)给定一个位置坐标P和一个距离D,返回所有与P的距离小于等于D的城市。 [测试数据] 由学生依据软件工程的测试技术自己确定。注意测试边界数据。 2、约瑟夫生死者游戏 [问题描述] 约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 [基本要求] 利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 [测试数据] m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。 [实现提示] 程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码。设n≤30。 [选作内容] 向上述程序中添加在顺序结构上实现的部分。 3、括号匹配的检验 [问题描述] 假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或[([ ] [ ])]等为正确格式,[( ])或(((]均为不正确的格式。检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。例如:考虑下列的括号序列:

串的朴素模式匹配算法(BF算法)

//算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法 #include #include #define MAXL 255 #define FALSE 0 #define TRUE 1 typedef int Status; typedef unsigned char SString[MAXL+1]; //生成一个其值等于串常量strs的串T void StrAssign(SString &T, char *strs) { int i; T[0] = 0; //0号单元存储字串长度 for(i = 0; strs[i]; i++) //用数组strs给串T赋值 T[i+1] = strs[i]; T[0] = i; } //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0 int Index(SString S, SString T, int pos) { int i = pos, j = 1; while(i <= S[0] && j <= T[0]) { if(S[i] == T[j]) //继续比较后面的字符 { i++; j++; } else//指针回退,重新开始匹配 { i = i -j + 2; j = 1; } } if(j > T[0]) return i - T[0]; else return 0;

int main() { SString S, T; int m; char strs1[MAXL]; //建立主串S char strs2[MAXL]; //建立模式串T printf("请输入主串和子串:\n"); printf("主串S: "); scanf("%s", strs1); printf("子串T: "); scanf("%s", strs2); StrAssign(S, strs1); StrAssign(T, strs2); m = Index(S, T, 1); if(m) printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m); else printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2); return 0; }

数据结构课程设计---括号匹配

目录 1.1 题目.................................................... 2............... 1.2 问题.................................................... 2............... 2 设计...................................................... 2 ............... 2.1 存储结构设计............................................ 2 ............. 4 对设计和编码的讨论和分析................................. 2..1. 4.1 设计................................................... 2..1.. 4.2 对编码的讨论........................................... 2..1. 5 总结和体会.............................................. 2..3 ........... 附录一 ................................................... 2..4 ............. 本科生课程设计成绩评定表.......................................... 错...误... !未定义书签 1 问题描述 .................................................................................................... 2 ............. 1.3 要求......................................................................................................... 2 .............. 2.2 主要算法设计........................................................................................... 3 ........... 2.3 测试用例及测试结果............................................................................... 6 ......... 3 调试报告 .................................................................................................... 9 .............

正则表达式

[23:39:35] 王尧说:"^\d+$"//非负整数(正整数+ 0) "^[0-9]*[1-9][0-9]*$"//正整数 "^((-\d+)|(0+))$"//非正整数(负整数+ 0) "^-[0-9]*[1-9][0-9]*$"//负整数 "^-?\d+$"//整数 "^\d+(\.\d+)?$"//非负浮点数(正浮点数+ 0) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数 "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"//非正浮点数(负浮点数+ 0) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//负浮点数 "^(-?\d+)(\.\d+)?$"//浮点数 "^[A-Za-z]+$"//由26个英文字母组成的字符串 "^[A-Z]+$"//由26个英文字母的大写组成的字符串 "^[a-z]+$"//由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串 "^\w+$"//由数字、26个英文字母或者下划线组成的字符串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"//email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ //年-月-日 /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ //月/日/年 ^(\w+((-\w+)|(\.\w+))*)\+\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$ //Emil "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1, 2}|1dd|2[0-4]d|25[0-5])$" //IP地址 匹配中文字符的正则表达式:[\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 匹配空行的正则表达式:\n[\s| ]*\r 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 匹配Email地址的正则表达式:^(\w+((-\w+)|(\.\w+))*)\+\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$ 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 漢字 Private Ps_KanjiRegex As String = "\u00A0-\u303F\u3200-\u33CF\u4E00-\uFF60\uFFA0-\uFFE5" ''入力可能漢字のコード(正規表現チェック用)

用栈实现括号匹配的检验 修改

用栈实现括号匹配的检验修改(2008-11-14 19:06:31) 标签:c语言编程turbo c2.0环境实现栈括号匹配it 分类:C语言编程例子数据结构C 语言版 括号匹配问题是编译程序时经常遇到的问题,用以检测语法是否有错。 本文前些天写的用栈实现括号匹配的检验的代码中,其中用了更少变量的代码二有些错误,使得结果总是match,经过修改,现将正确的代码写出,如下 #include #include #define OVERFLOW -1 #define OK 1 #define ERROR 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define NULL 0 typedef char SElemType; typedef int Status; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack *S) { (*S).base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); (*S).top=(*S).base; (*S).stacksize=STACK_INIT_SIZE; return OK; } Status DestroyStack(SqStack *S) { free((*S).base); (*S).base=NULL; (*S).top=NULL;

括号匹配(数据结构实验报告)

课程名称: 《数据结构》课程设计课程设计题目: 括号匹配 姓名:*** 院系:计算机科学与技术学院 专业:计算机科学与技术 年级:** 学号:******* 指导教师:*** 2015 年 09月 10 日

目录 1 课程设计的目的 (1) 2 需求分析 (3) 3 课程设计报告内容 (3) 3.1概要设计 (3) 3.2详细设计 (3) 3.3调试分析 (5) 4 总结 (7) 5 程序清单 (8) 6 参考文献 (7)

1.课程设计的目的 (1) 熟练使用C 语言编写程序,解决实际问题; (2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; (3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; (4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 2.需求分析 本程序文件主要的功能是判断括号的匹配问题。 程序的执行是从事先输入好数据的文档中读取,然后对所读取的数据进行括号匹配行的判断。最后输出判断的结果。 程序函数主要有void InitStack(Stack *S)、ElemType GetTop(Stack S,ElemType *e)、void push(Stack *S,ElemType e)、ElemType pop(Stack *S,ElemType *e)、int Judge(ElemType a[])。InitStack函数是用来初始化栈;GetTop函数是用来获取栈顶元素;push是用来把元素压栈、pop函数是用来把元素弹出栈、Judge函数是用来判断括号是否匹配。 3 括号匹配的设计 3.1概要设计 算法分析: 首先设置好一个栈,然后从文件中读入数据,在读入的数据时,从文件中读取的字符串存入到函数定义好的字符数组中。然后把该数组作为函数参数。当每读入一个‘(’或者是‘[’,就把这个元素压栈,若是读入的元素是‘]’或者是‘)’,就调用GetTop函数,来获取栈顶元素,如果获取的栈顶元素和该次读入的元素匹配而且栈不空的话,就说明该元素是匹配的,继续比较下一次的元素;如果获取的栈顶元素和该次读入的元素不匹配的话,就说明该元素是不匹配的,直接结束运行。当所有的‘)’或者是‘]’全部比较完成之后,栈仍然不空,说明栈中还剩有‘[’或者‘(’,括号不匹配。 3.2详细设计 void InitStack(Stack *S)//建造一个栈 { S->base = (ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType)); if(!*S->base) printf("error"); S ->top = S ->base;//将栈设置为空栈 S->stacksize = STACK_INIT_SIZE;//将栈的空间大小设置为STACK_INIT_SIZE } 建栈的操作首先将栈指针s->指向新开辟的内存空间。然后将栈顶指针s->top等于s->base。将栈置成空栈。 ElemType GetTop(Stack S,ElemType *e)//获取栈顶元素 { if(S.top!=S.base) { *e=*(S.top-1); return *e; }

数据结构复习题考试参考

第一章 一、填空题 1 .......................是数据的基本单位,.......................是具有独立含义的最小标识单位。 3 数据之间的关系(逻辑结构)有四种.......................、.......................、 .......................、.......................,可分为....................... ....、...................两大类。 4 数据的存储结构包括.......................、...........................。. 二、问答题 1. 什么是数据结构?什么是数据类型? 2. 叙述算法的定义与特性。 3. 叙述算法的时间复杂度。 三、判断题(在各题后填写“√”或“×”) 1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存 放。( ) 2.下列几种数量级从小到大的排列顺序为: O(1) 、O(logn)、O(n) 、O(nlogn) 、O(n 2) 、O(n 3 ) 、O(2n ) 。( ) 四、算法分析 1. 计算机执行下面的语句时,语句s 的执行频度(重复执行的次数)为 _______ 。 FOR(i=l ;i=i;j--) s; 2.有下列运行时间函数: (1)T 1 (n)=1000; (2)T 2(n)=n 2+1000n; (3)T 3(n)=3n 3+100n 2+n+1; 分别写出相应的大O 表示的运算时间。(1)_______ (2)_______ (3)_______ 3. 设n 为正整数,利用大O 记号,将该程序段的执行时间表示为n 的函数,则下列程序段的时间复杂度可表示为 (1) _______ (2)_______ (....) 1)float sum1(int n){ /* 计算1!+2!+…+n! */ p=1; sum1=0; for (i=1; i<=n; ++i){ p=p*i; sum1=sum1+p } }/* sum1 */ (2) float sum2(int n){ /* 计算1!+2!+…+n! */ sum2=0; for (i=1; i<=n; ++i){ p=1; for (j=1; j<=i; ++j) p=p*j;

正则表达式快速记忆法

要想学会正则表达式,理解元字符是一个必须攻克的难关。 不用刻意记 .:匹配任何单个字符。 例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“bg”,但是不匹配“buug”,“b..g”可以匹配“buug”。 [ ] :匹配括号中的任何一个字符。 例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。 ( ) :将()之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。 | :将两个匹配条件进行逻辑“或”运算。 'z|food'能匹配"z"或"food"。'(z|f)ood'则匹配"zood"或"food"。 *:匹配0至多个在它之前的子表达式,和通配符*没关系。 例如正则表达式“zo*”能匹配“z”、“zo”以及“zoo”;因此“.*”意味着能够匹配任意字符串。"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。 + :匹配前面的子表达式一次或多次,和*对比(0到多次)。 例如正则表达式9+匹配9、99、999等。“zo+”能匹配“zo”以及“zoo”,不能匹配"z"。 ? :匹配前面的子表达式零次或一次。 例如,"do(es)?"可以匹配"do"或"does"。一般用来匹配“可选部分”。 {n} :匹配确定的n次。 "zo{2}"→zoo。例如,“e{2}”不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。 {n,} :至少匹配n次。 例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配“seeeeeeeed”中的所有“e”。 {n,m}:最少匹配n次且最多匹配m次。 “e{1,3}”将匹配“seeeeeeeed”中的前三个“e” ^(shift+6):匹配一行的开始。 例如正则表达式“^regex”能够匹配字符串“regex我会用”的开始,但是不能匹配“我会用regex”。 ^另外一种意思:非!(暂时不用理解) $ :匹配行结束符。 例如正则表达式“浮云$”能够匹配字符串“一切都是浮云”的末尾,但是不能匹配字符串“浮云呀”

串的模式匹配算法

串的匹配算法——Brute Force (BF)算法 匹配模式的定义 设有主串S和子串T,子串T的定位就是要在主串S中找到一个与子串T相等的子串。通常把主串S称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串S中找到一个模式串T;不成功则指目标串S中不存在模式串T。 BF算法 Brute-Force算法简称为BF算法,其基本思路是:从目标串S的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串S的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串S中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下: /*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0. /*T非空。 int index(String S, String T ,int pos) { int i=pos; //用于主串S中当前位置下标,若pos不为1则从pos位置开始匹配int j =1; //j用于子串T中当前位置下标值 while(i<=S[0]&&j<=T[0]) //若i小于S长度且j小于T的长度时循环 { if(S[i]==T[j]) //两个字母相等则继续 { ++i; ++j; } else //指针后退重新开始匹配 { i=i-j+2; //i退回到上次匹配首位的下一位 j=1; } if(j>T[0]) return i-T[0]; else return 0; } }

BF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m 次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m 从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是O(n+m).

数据结构与算法期末考试复习试题

精品文档 《数据结构与算法》复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。 A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位

C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。 (1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系 C.分析算法的效率以求改进C.分析算法的易读性和文档性 (2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 精品文档. 精品文档 2) 。8.下面程序段的时间复杂度是O(n s =0; for( I =0; i

相关主题
文本预览
相关文档 最新文档