题目链接

一 知识点:

  1  substr有2种用法:

      假设:string s = "0123456789";

     string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789"

     string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567"

     2  find( x, p )   从p位置开始查找字符x的位置

     3  c++的split函数(自己搭建),利用strtok函数

       

vector <string> split (const string& dem,const string & str) {// 将以dem为分隔的字符串分割
vector <string> res;
char *ss = new char[str.size() + ];
strcpy (ss, str.c_str());// string转字符串
char*p = strtok(ss, dem);
while (p) {
string s = p;
res.push_back(s);
p = strtok(NULL, dem);
}
return res;
}

二  想法

 1 用split提取有用信息

 2 对于复合查询采用递归方式的查询

三 代码

 #include <bits/stdc++.h>
using namespace std;
struct head {
vector <string> col;
};
head h[]; int cnt = ;
map <string, int> mapp;
struct data {
int id;// 对应的表头
int num; // 有多少行
vector <string> c []; //存储每行的信息
int a[]; // 存储每行各元素所对应的列
};
data d[];
const char* dem = ", ";
string sub (const string& str, int p, char last) {// 截取从p位置到以last结尾的字符串(不包括last)
int p2 = str.find(last, p);// 从p位置开始查找last
return str.substr(p, p2 - p);// 从p位置开始长度为(p2-p)的字符串
}
vector <string> split (const string & str) {// 将以dem为分隔的字符串分割
vector <string> res;
char *ss = new char[str.size() + ];
strcpy (ss, str.c_str());// string转字符串
char*p = strtok(ss, dem);
while (p) {
string s = p;
res.push_back(s);
p = strtok(NULL, dem);
}
return res;
}
int find_c (const string& str, const vector <string>& res) { //查找str 对应表头列的序号
for (int i = ; i < res.size(); i++)
if (str == res[i])
return i;
}
void m_print (const data& t) {
for (int i = ; i <= t.num; i++) {
cout << t.c[i][];
for (int j = ; j < t.c[i].size(); j++)
cout << " " << t.c[i][j];
cout << endl;
}
cout << endl;
}
void creat (const string& s) {
string ta = sub(s, , '(');// 截取表头
int p = s.find('(');
string s1 = sub(s, p + , ')'); // 截取各列信息
mapp[ta] = ++cnt;// 各个表与id对应
h[cnt].col = split(s1);
return ;
}
void inser (const string&s) {
// 表的信息
string ta = sub(s, , '('); // 插入的列表
int p1 = s.find('(');
string s1 = sub(s, p1 + , ')');
vector <string> r1 = split (s1); // 插入的信息
int p2 = s.rfind('(');
string s2 = sub(s, p2 + , ')');
vector <string> r2 = split(s2); int id = mapp[ta]; int len = h[id].col.size()
int k = ++d[id].num;
for (int i = ; i < len; i++) d[id].c[k].push_back(""); for (int i = ; i < r1.size(); i++) {
int t = find_c(r1[i], h[id].col); // 找到要出插入列 在表头列表中的位置
d[id].c[k][t] = r2[i];
}
}
data se1 (const string& s) {// 无递归查询 返回一个集合
data ans; ans.num = ;
// res 查询的列集合
int p1 = s.rfind("from ");
string s1 = s.substr (, p1 - );
vector <string> res = split(s1); string ta = sub (s, p1 + , ';');// 表头
int id = mapp[ta];
ans.num = d[id].num;
ans.id = id; for (int i = ; i <= ans.num; i++)// 每一行
for (int j = ; j < res.size(); j++) {// 每一列
int k = find_c(res[j], h[id].col);
ans.a[j] = k;
ans.c[i].push_back(d[id].c[i][k]);
}
return ans;
}
data se2 (const string&s ) {//递归求解查询2
data ans; ans.num = ;
// 得到前半部分t1集合(先忽略条件)
int p1 = s.find ("where ");
if (p1 == string::npos) return se1(s);
string s1 = s.substr (, p1);
s1[p1 - ] = ';'; data t1 = se1(s1); int p2 = s.find ("in ");
string ss = s.substr(p1 + , p2 - - p1);
int k = find_c (ss, h[t1.id].col);// 得到指定列 //得到条件集合t2
string s2 = s.substr(p2 + );
data t2 = se2(s2); //按条件筛选t1
for (int i = ; i <= t1.num; i++)
for (int j = ; j <= t2.num; j++)
if ( d[t1.id].c[i][k] == t2.c[j][]) {
ans.num++;
ans.c[ans.num] = t1.c[i];
break;
}
return ans;
}
int main ()
{
string s;
while (getline(cin, s)) {
if (s[] == 'c') creat (s);
else if (s[] == 'i') inser(s);
else if (s[] == 's' && s.find(" where ") == string::npos) {
data t = se1(s); m_print(t);
}
else {
data t = se2(s); m_print(t);
}
}
return ;
}

后记:

缺点 :采用STL速度较慢.

优点: 代码简洁易懂

   

xdoj-1298(模拟--简易SQL解释器)的更多相关文章

  1. Python模拟简易版淘宝客服机器人

    对于用Python制作一个简易版的淘宝客服机器人,大概思路是:首先从数据库中用sql语句获取相关数据信息并将其封装成函数,然后定义机器问答的主体函数,对于问题的识别可以利用正则表达式来进行分析,结合现 ...

  2. 模拟实现SQL Server字段列显示的数据类型

    本文目录列表: 1.SQL Server表设计视图中的数据类型列展示效果 2.模拟实现类似的数据类型显示效果 3.测试效果 4.总结语 5.参考清单列表   1.SQL Server表设计视图中的数据 ...

  3. 模拟实现SQL Server中的datepart(week,date)的功能

    本文目录列表: 1.为什么要模拟实现datepart(week,date)的功能 2.具体实现思路 3.T-SQL代码实现逻辑 4.总结语 5.参考清单列表   1.为什么要模拟实现datepart( ...

  4. WindowsPhone模拟简易Toast弹出框

    Coding4Fun这个开源控件中有ToastPrompt这个弹出框组件,但是由于Coding4Fun太庞大,如果只用到ToastPrompt这个控件的话,整个引用不太值当的.于是自己写了一个差不多的 ...

  5. java模拟简易按键精灵

    很多小伙伴们都有过抢课的经历,有时候抢不到自己想上的课,只能盼望有人退选,可是很多时候别人退选了,但是很快又被别人抢走了,我们不可能时刻盯着电脑, 这时候如果有一个抢课的程序岂不是很棒.. 出于这个目 ...

  6. 简易SQL语句

    /*创建 模式 为用户 User1*/ CREATE SCHEMA test authorization User1; CREATE SCHEMA test USER User1; CREATE TA ...

  7. linux c++模拟简易网络爬虫

    /* * To change this license header, choose License Headers in Project Properties. * To change this t ...

  8. .NET面试题系列[14] - LINQ to SQL与IQueryable

    .NET面试题系列目录 名言警句 "理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列." - Jon Skeet LINQ to Obje ...

  9. SQL Server Profiler

    一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问 ...

随机推荐

  1. vs 编译库文件 Qt编译库文件

    QT 库能不能用 需要关注是minGW 还是MSVC编译的 Qt MinGW与MSVC对比  转:https://blog.csdn.net/u013185164/article/details/48 ...

  2. nyoj-0469-擅长排列的小明 II(找规律)

    nyoj-0469-擅长排列的小明 II 思路:递推分析:为了简便起见,我们用Ai代表第i个数字 , 由于A1一直是1,所以A2只能是2或3.假设dp[n]表示1->n这个序列的方案数      ...

  3. 【阅读笔记】《C程序员 从校园到职场》第四章 变量和函数

    参考: Contents: 一.数据类型(对基本数据类型进行重定义——规范化) 二.变量和函数  (命名规则,注意事项) 三.静态变量及其使用 一.数据类型(对基本数据类型进行重定义——规范化) 1. ...

  4. Oracle 11gR2 Database UNDO表空间使用率居高不下处理

    一.UNDO表空间监控图 Prometheus监控的到UNDO表空间使用率超过90%(90%为所有表空间告警阈值).从图中可以看到,多次增加UNDO表空间的DATAFILE,UNDO表空间达到40GB ...

  5. Web API之路由浅谈

    Web API的路由,是指明接口地址的方向,是照亮获取数据路上的灯塔,其重要性不言而喻. 本篇文章以vs2015为例,一步步说明路由的创建及使用,其中包括默认路由.自定义路由和特性路由. 一.默认路由 ...

  6. 《Python》线程之锁、信号量、事件、条件、定时器、队列

    一.锁 线程为什么要有锁: += .-= 赋值操作数据不安全(要经过取值.计算.放回值,3部操作) pop .append 都是数据安全的(只有添加和删除,一次操作) 队列也是数据安全的 1.同步锁 ...

  7. 安装babel

    http://jamesknelson.com/using-es6-in-the-browser-with-babel-6-and-webpack/

  8. 线程安全的集合类、CopyOnWrite机制介绍(转)

    看过并发编程的书,这两种机制都有所了解,但不扎实其实.看到别人的博客描述的很精辟,于是转过来,感谢! 原文链接:https://blog.csdn.net/yen_csdn/article/detai ...

  9. ASCII码,utf-8

    ASCII:0-127表示英文,128-255每个国家编码不一样,汉字要使用两个字节,为了和0-127区别,首位都要是1,uriEncode就是把字符转换成ASCII码. utf-8,一个字节的,和a ...

  10. oracle 正则表达式 匹配

    oracle 正则表达式 在实际应用中,想排除带有中文的字段值: select h.froomnumber from t_broker_house h where REGEXP_LIKE(froomn ...