问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

(急)一道C语言数据结构习题

发布网友 发布时间:2022-05-21 01:56

我来回答

1个回答

热心网友 时间:2023-10-11 08:24

  相关代码见后面。

  这里整理一下需求如下:

  函数 char*String_Match(int dir,char* str,char* exp);

  dir表示方向,1表示正向查找 -1表示逆向查找

  str是待查找的字符串,里面是一个空字符结尾的字符串

  exp是要查找的表达式,可能包含?(匹配任意一个非空字符)或者*(匹配任意字符串)

  代码如下 vs2010编译通过(控制台程序工程、无MFC支持、cpp代码)

#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <string.h>
//空间复杂度是O(n) 时间复杂度是O(n的平方) 是的,效率不高
char* String_Match(int dir,char* str,char* exp);
int main(int argc,char**argv,char**env)
{
    char str[]="abcdefghijklmn";
    char exp1[]="a*c";
    char exp2[]="h*?l";
    char* sub = String_Match(1,str,exp1);
    printf("%s",sub);//注意这里会将整个字符串打印出来,如果只要部分,需要修改函数,我这里只返回字串的首地址指针
    sub = String_Match(-1,str,exp2);
    printf("%s",sub);
    return 0;
}
bool match(char *str,char *pat)
{
switch(*pat){
case '\0': 
return !*str;
case '*': 
return match(pat+1,str)||(*str)&&match(pat,str+1);
case '?':
return *str&&match(pat+1,str+1);
default:
break;
}
return (*pat==*str)&&match(pat+1,str+1);
}
char* String_Match(int dir,char* str,char* exp)
{
int i;
char* ret = NULL;
//参数检查 没有检查str或者exp的有效性
if(dir != -1 &&(dir!=1)) return NULL;
if(str==NULL || (exp == NULL))return NULL;
int nLen = strlen(str);
int nExpLen = strlen(exp);
if((nLen <= 0) || (nExpLen <= 0) || (nLen<nExpLen))//注意这里排除了exp比str长的可能
return NULL;
//方向处理
char* Str = NULL;
char* Exp = NULL;
if(dir==-1){//对于逆序查找,可以将要查找的字符串和表达式逆序,然后就变成顺序查找了
Str = new char[nLen];
Exp = new char[nExpLen];
if(Str == NULL || (Exp == NULL)){
if(Str)delete []Str;
if(Exp)delete []Exp;
return NULL;
}
for (i=nLen-1;i>=0;i--)
{
Str[nLen-i-1] = str[i];
}
for (i=nExpLen-1;i>=0;i--)
{
Exp[nExpLen-i-1] = exp[i];
}
}else{
Str = str;
Exp = exp;
}
//现在进行顺序查找即可了
do{
int nIndex = 0;
char* pFirst = NULL;
char fr = 0;
int nCount = 0;
std::string subExp;//表达式中最前的不包含通配符的连续子串
std::string preSub;//表达式中最前的通配符子串
for(i=0;i<nExpLen;i++)//寻找第一个非通配符字符,并统计前面的通配符个数
{
fr = Exp[i];
if(fr=='?')nCount++;
if((fr=='?')||(fr=='*'))
preSub += fr;
} while ((fr!='?')&&(fr!='*'));
if(fr == '?' || (fr == '*')){//全是通配符,直接返回即可
ret = exp;
break;
}
for(i=0;i<nLen;i++)
{
if(match(Str+i,Exp)){
ret = Str+i;
break;
}
}
}while(0);
if(dir==-1){//回收内存
if(ret!=NULL){//因为是逆序的,所以要颠倒一下
ret = str + nLen - (ret-Str) -1;
}
delete[]Str;
delete[]Exp;
}
return ret;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 关于数据结构C语言版的习题问题 数据结构题集 c语言版 怎么样 数据结构(C语言版)题目解答 c语言题型,数据结构题 数据结构题集(c语言版)答案 微信发不了红包是怎么回事?1 为什么微信里发不了红包 如何“制造”团队凝聚力 请问如何才能有效地提高团队凝聚力,增强团队合作精神? 凝聚力比较差的团队,依靠把袖手旁观的人踢出团队,是不是凝聚力就大大增强? 作为团队领导,感到力不从心,团队的凝聚力不够,该怎么吧办呢? 怎么提高团队凝聚力 为什么团队没有凝聚力? 09年秋季女生服装搭配 惠普暗影精灵怎样调显卡性能 四面出风卡式风盘空调器是什么样的 急!饭后走半小时可以跑步吗?谢谢 吃完饭半小时后可以跑步么 饭后半小时跑步对身体好吗 什么叫做料酒? 数据结构题目,用c语言实现。 关于c语言数据结构的一道题 黑白衣柜 书桌配什么颜色 粉红色壁纸配什么颜色书桌 跪求各位颜色搭配大师,墙面的木纹绿色,桌子是白桌,温莎椅到底用什么颜色搭配才好看,这是个儿童餐厅, 香港万豪酒店提前退房 万豪酒店第二天最晚什么时候要退房 苏州万豪酒店正常的退房时间是几点?苏州万豪酒店有事推迟退房是否加收房费? 万豪酒店 如何处理客服抱怨 万豪酒店(预付),在入住时,还需要另交押金吗 男孩发育期间补什么好 煤气罐突然漏气的原因是什么? 正在青春期发育的男孩子要怎么给他补钙,食补不要吃药。 最近半个月没用过煤气罐,阀是去年换的,今天突然漏气了,会是人为吗 男孩子正发育吃什么补钙的最好 请问,开个理发店,一天的客流量要多少个才算正常呢!请有经验的朋友这点下谢谢! 在新加坡开个快剪店,一天大概能有多少顾客 一个100平方米的理发店一般一天多少人?用水量又是多少 在理发店工作时间是不是都很长,听说一天10几个小时 我不懂理发行业,想开一家快剪店,跟师傅6&#47;4分合理吗?会不会赚钱,哪位大神指点迷津