编程从广义表字符串表示中直接获取广义表有关信息

来源:互联网 发布:淘宝客招募网站 编辑:程序博客网 时间:2024/06/15 12:40

(1)扫描广义表字符串表示获取所有子串及其深度,位置,长度,数目

基本思路和我之前写的文章《 

广义表的非递归深度优先遍历及相关运算的c++实现

》中介绍的一致,只不过遍历的对象从链表变成字符串,原先程序稍作修改就能得到如下代码:

#include "stdafx.h"#include <iostream>#include <string>#include <vector>using namespace std;class Gennode{public:int numnode;   //子表中表元素数目int startposition;  //子表左括号位置Gennode(int s) :startposition(s), numnode(0) {}};void output(vector<Gennode> &stack);int main(){string glist;cout << "请输入广义表字符串形式" << endl;cin >> glist;vector<Gennode> stack;int place = 0, subcount = 0; //place广义表字符串中字符索引位置,subcount计数子表for (auto i = glist.cbegin(); i != glist.cend(); ++i)  //遍历广义表{if (*i == '('){++place;Gennode temp(place);if (i != glist.cbegin())++stack[stack.size() - 1].numnode;  //如该左括号属于子表,需要将该子表所在子表的表项数目增一stack.push_back(temp);}else if (*i == ')'){++place;++subcount;if (stack[stack.size() - 1].numnode == 0 && stack[stack.size() - 1].startposition == 1)//stack[stack.size() - 1].numnode值决定是否为空表,stack[stack.size() - 1].startposition{                                                                                      //决定子表是否为广义表本身cout << "第" << subcount << "个子表(为广义表本身且为空表):()" << endl;cout << "长度:" << stack[stack.size() - 1].numnode << " 深度:" << stack.size() << endl;cout << "(位置:从左至右数起第" << stack[stack.size() - 1].startposition << "个 ";cout << ")位置:从左至右数起第" << place << "个"<< endl;cout << "该子表位置:广义表本身";cout << endl;}else{if (stack[stack.size() - 1].numnode != 0 && stack[stack.size() - 1].startposition != 1){cout << "第" << subcount << "个子表:";for (string::size_type i = stack[stack.size() - 1].startposition - 1; i < place; ++i)cout << glist[i];cout << endl;cout << "长度:" << stack[stack.size() - 1].numnode << " 深度:" << stack.size() << endl;cout << "(位置:从左至右数起第" << stack[stack.size() - 1].startposition << "个 ";cout << ")位置:从左至右数起第" << place << "个" << endl;cout << "该子表位置:";output(stack);cout << endl;}else{if (stack[stack.size() - 1].numnode == 0){cout << "第" << subcount << "个子表(空表):()";cout << endl;cout << "长度:" << stack[stack.size() - 1].numnode << " 深度:" << stack.size() << endl;cout << "(位置:从左至右数起第" << stack[stack.size() - 1].startposition << "个 ";cout << ")位置:从左至右数起第" << place << "个" << endl;cout << "该子表位置:";output(stack);cout << endl;}else{cout << "第" << subcount << "个子表(为广义表本身):";for (string::size_type i = stack[stack.size() - 1].startposition - 1; i < place; ++i)cout << glist[i];cout << endl;cout << "长度:" << stack[stack.size() - 1].numnode << " 深度:" << stack.size() << endl;cout << "(位置:从左至右数起第" << stack[stack.size() - 1].startposition << "个 ";cout << ")位置:从左至右数起第" << place << "个" << endl;cout << "该子表位置:广义表本身";cout << endl;}}}stack.pop_back();}else if (*i != ','){++place;++stack[stack.size() - 1].numnode;}else{++place;}}    return 0;}

(2)获取所有子表左右括号位置和序数

和上面,思路和那篇文章中提到的完全一致,对文章中代码稍作修改即可:

#include "stdafx.h"#include <iostream>#include <string>#include <vector>using namespace std;class Gennode{public:int numnode;int startposition;Gennode(int s) :startposition(s), numnode(0) {}};int main(){string glist;cout << "请输入广义表字符串形式" << endl;cin >> glist;vector<Gennode> stack;int place = 0, subcount = 0, left=0, right=0;  //left左括号序数,right右括号序数for (auto i = glist.cbegin(); i != glist.cend(); ++i){if (*i == '('){++place;++left;Gennode temp(place);if (i != glist.cbegin())++stack[stack.size() - 1].numnode;stack.push_back(temp);}else if (*i == ')'){++place;++right;++subcount;cout << "第" << subcount << "个子表:";for (string::size_type i = stack[stack.size() - 1].startposition - 1; i < place; ++i)cout << glist[i];cout << endl;cout << "第" <<left << "个(位置:从左至右数起第" << stack[stack.size() - 1].startposition << "个 ";    cout << "第" << right << "个)位置:从左至右数起第" << place << "个" << endl;cout << endl;stack.pop_back();}else if (*i != ','){++place;++stack[stack.size() - 1].numnode;}else{++place;}}return 0;}

(3)在广义表搜索给定关键字,找出含关键字的所有子表以及关键字在子表中的位置

#include "stdafx.h"#include <iostream>#include <string>#include <vector>using namespace std;class Gennode{public:int numnode;int startposition;vector<int> position;Gennode(int s) :startposition(s), numnode(0) {}};void output(vector<Gennode> &stack);int main(){string glist;cout << "请输入广义表字符串形式" << endl;cin >> glist;char key;cout << "输入要搜索的值" << endl;cin >> key;vector<Gennode> stack;int place = 0, subcount = 0;for (auto i = glist.cbegin(); i != glist.cend(); ++i){if (*i == '('){++place;Gennode temp(place);if (i != glist.cbegin())++stack[stack.size() - 1].numnode;stack.push_back(temp);}else if (*i == ')'){++place;if (stack[stack.size() - 1].position.size() != 0){++subcount;if (stack[stack.size() - 1].numnode != 0 && stack[stack.size() - 1].startposition != 1){cout << "第" << subcount << "个含"<<key<<"的子表:";for (string::size_type i = stack[stack.size() - 1].startposition - 1; i < place; ++i)  //输出子表cout << glist[i];cout << endl;cout << key << "的位置:";for (vector<int>::size_type i = 0; i < stack[stack.size() - 1].position.size(); ++i)   //输出关键字在子表中位置cout << "第" << i + 1 << "个" << key << "位于子表从左至右数起第" << stack[stack.size()-1].position[i] << "个";cout << endl;cout << "长度:" << stack[stack.size() - 1].numnode << " 深度:" << stack.size() << endl;cout << "(位置:从左至右数起第" << stack[stack.size() - 1].startposition << "个 ";cout << ")位置:从左至右数起第" << place << "个" << endl;cout << "该子表位置:";output(stack);cout << endl;}else{cout << "第" << subcount << "个子表(为广义表本身):";for (string::size_type i = stack[stack.size() - 1].startposition - 1; i < place; ++i)cout << glist[i];cout << endl;cout << key << "的位置:";for (vector<int>::size_type i = 0; i < stack[stack.size() - 1].position.size(); ++i)cout << "第" << i + 1 << "个" << key << "位于子表从左至右数起第" << stack[stack.size() - 1].position[i] << "个";cout << endl;cout << "长度:" << stack[stack.size() - 1].numnode << " 深度:" << stack.size() << endl;cout << "(位置:从左至右数起第" << stack[stack.size() - 1].startposition << "个 ";cout << ")位置:从左至右数起第" << place << "个" << endl;cout << "该子表位置:广义表本身";cout << endl;}}stack.pop_back();}else if (*i != ','){++place;++stack[stack.size() - 1].numnode;if (key == *i)    //搜索到关键字,需要向关键字所在子表的栈节点的position对象中压入该关键字位置stack[stack.size() - 1].position.push_back(stack[stack.size() - 1].numnode);}else{++place;}}return 0;}


原创粉丝点击