变位词程序的实现

一、前言

《编程珠玑》第二章有一个变位词程序的实现问题,所谓变位词就是把某个单词中字母位置顺序加以改变形成的新词。文中提到的变位词程序设计思想是按三阶段的”管道“组织,第一阶段标志单词,第二阶段排序标志后的文件,第三阶段分类输出。如图:

变位词程序的实现_第1张图片

  这中管道组织程序的形式的另一个好处是使得程序调理清晰。

二、程序实现

我这里用C++实现,程序中用到了容器和泛型算法的内容,思路和图中的流程一样,先是读入字符串,将每个字符串排序处理形成pair后压入vector中,之后我们对vector中的pair元素进行排序,这里用到泛型算法,对容器重排序,然后按要求输出元素。

三。代码

//Author:YunMengze
//DateTime:2013.12.26
//编程珠玑变位词程序实现
#include<cstdlib>
#include<iostream>
#include<vector>
#include<utility>
#include<string>
#include <algorithm>
using namespace std;
//升序函数
int char_comp(const void *x, const void *y)
{
	return *(char*)x - *(char*)y;

}
pair<string,string>
//将字符串重排序,形成pair对,first为重排字符串,second为原始字符串
sign_process(string in_word)
{
	pair<string, string> word_pair;
	word_pair.second = in_word;
	const char* c_string = in_word.c_str();//转换为C风格字符串
	qsort((void*)c_string, strlen(c_string), sizeof(char), char_comp);
	word_pair.first = c_string;
	return word_pair;
}
//调用泛型算法对vector中的元素排序,pair首先按first值排序
void sort_process(vector<pair<string, string>> &src_vec)
{
	sort(src_vec.begin(), src_vec.end());
}
//输出格式处理
void squash_process(const vector<pair<string, string>> &src_vec)
{
	string old_str;
	for (auto i : src_vec)
	{
		if (i.first!=old_str)
		{
			old_str = i.first;
			cout << "\n"<<i.second << " ";
		}
		else
		{
			cout << i.second << " ";
		}
	}
}
int main()
{
	string word;
	vector< pair<string, string> > vec;
	while (cin>>word)
	{
		if (word == "Q") //Q为输入结束符
			break;
		pair<string, string> tem_pair = sign_process(word);
		vec.push_back(tem_pair);
	}
	sort_process(vec);
	squash_process(vec);
}







   

你可能感兴趣的:(编程,泛型,快速排序)