<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CS练功房]]></title><description><![CDATA[任何没有经过验证的理论都是值得怀疑的]]></description><link>https://blog.csdn.net/furney</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; furney]]></copyright><item><title><![CDATA[字符串的转换、逆置、删除重复元素及判断是否为邮件格式]]></title><link>https://blog.csdn.net/furney/article/details/8049959</link><guid>https://blog.csdn.net/furney/article/details/8049959</guid><author>furney</author><pubDate>Mon, 08 Oct 2012 21:06:42 +0800</pubDate><description><![CDATA[1.给定的一个字符串，比如：this is my program，要求将每个单词的首字母大写，输出：This Is My Program 。

#include 

int getsline(char *s)
{
	int i = 0, c;
	if(s == NULL)
		return 0;
	for(i = 0; (c = getchar()) != EOF && c != '\n';]]></description><category></category></item><item><title><![CDATA[宏定义打印Hello World]]></title><link>https://blog.csdn.net/furney/article/details/8041474</link><guid>https://blog.csdn.net/furney/article/details/8041474</guid><author>furney</author><pubDate>Fri, 05 Oct 2012 15:47:54 +0800</pubDate><description><![CDATA[#include "stdio.h"
void print()
{
    *
}
void main()
{
}
在*号处加一段代码,显示出"hello,world".
分析：c++程序运行的入口函数是main()，因此要想办法在*处增加的代码中调用到main()函数。在c++中宏定义可以实现代码的替换，因此从宏定义入手可以解决这个问题。
为了实现main()函数的运行，需要将main作替]]></description><category></category></item><item><title><![CDATA[加减表达式求值]]></title><link>https://blog.csdn.net/furney/article/details/8025326</link><guid>https://blog.csdn.net/furney/article/details/8025326</guid><author>furney</author><pubDate>Thu, 27 Sep 2012 16:16:13 +0800</pubDate><description><![CDATA[一个字符串只由'+','-'和‘0’-‘9’组成，并且'+','-'只作为为二元运算符，计算该表达式的值。
思路：由于表达式只包含加、减两种运算，而加减运算是没有优先级的，因此可以顺序对表达式求值。首先提取表达式第一个数和第一个操作符，然后再提取第二个数，依据操作符将两个数相加或相减，得到的结果作为新的第一个数，再在表达式中提取一个操作符和操作数计算，直到表达式结束。例如对于表达式“1+12-7]]></description><category></category></item><item><title><![CDATA[第一个只出现一次的字符]]></title><link>https://blog.csdn.net/furney/article/details/7990610</link><guid>https://blog.csdn.net/furney/article/details/7990610</guid><author>furney</author><pubDate>Tue, 18 Sep 2012 10:20:18 +0800</pubDate><description><![CDATA[利用哈希表的思想来解，首先设置一个数组保存字符串中每个字符出现的次数，第一趟遍历字符串计算出每个字符出现的次数，第二次遍历找出第一个只出现一次的字符。算法的时间复杂度为O(n)。

char FirstAppearedChar(char *str)
{
	if(str == NULL) // 数据合法性检验
		return '\0';

	unsigned int hashTable[256]]></description><category></category></item><item><title><![CDATA[连续子数组的最大和]]></title><link>https://blog.csdn.net/furney/article/details/7989075</link><guid>https://blog.csdn.net/furney/article/details/7989075</guid><author>furney</author><pubDate>Mon, 17 Sep 2012 20:54:45 +0800</pubDate><description><![CDATA[问题描述：输入一个整数数组，数组中有正数也有负数，一个或连续的多个整数组成一个子数组，求所有子数组的和的最大值。
求子数组的和的最大值，首先可以求出数组所有子数组的和，再逐一比较可以得到和的最大值。这是最直观易懂的一种解法。但是对一个长度为n的数组，总共有n(n+1)/2个子数组，计算所有子数组的和时间复杂度为O(n^2)。而当n较大时，这种算法是很难被用户接受的。
对于数组(a1, a2,]]></description><category></category></item><item><title><![CDATA[最小的K个数]]></title><link>https://blog.csdn.net/furney/article/details/7987950</link><guid>https://blog.csdn.net/furney/article/details/7987950</guid><author>furney</author><pubDate>Mon, 17 Sep 2012 16:09:30 +0800</pubDate><description><![CDATA[问题描述：给定的n个整数，计算其中最小的K个数。
最直观的解法莫过于将n个数按升序排列后输出前k个。但是就效率来看，这种方法并不是最理想的。一种改进方法是借助快速排序中对数组的划分，以第k个元素对数组进行划分，使得比第k个数字小的数字都在其左边，比其大的数字都在它的右边。
void Swap(int &a, int &b)
{
	int c = a; a = b; b = c;
}

int]]></description><category></category></item><item><title><![CDATA[字符串的排列]]></title><link>https://blog.csdn.net/furney/article/details/7984551</link><guid>https://blog.csdn.net/furney/article/details/7984551</guid><author>furney</author><pubDate>Sun, 16 Sep 2012 15:03:45 +0800</pubDate><description><![CDATA[描述：输入一个字符串，打印出该字符串字符的所有排列。比如给定字符串“abc”，即求字符’a‘，’b‘，’c’的全排列，结果应该是abc、acb、bac、bca、cba和cab总有六个。
1、全排列的递归方法
思路：对于这个问题，我们从结果来分析，以abc和acb为例可以看出，相当于以a为字符串首字符，再和b、c的全排列cb、cb连接构成。以此类推，可以确定以b、c为首字符的全排列。因此解决这个]]></description><category></category></item><item><title><![CDATA[计算器程序]]></title><link>https://blog.csdn.net/furney/article/details/7982101</link><guid>https://blog.csdn.net/furney/article/details/7982101</guid><author>furney</author><pubDate>Sat, 15 Sep 2012 14:47:06 +0800</pubDate><description><![CDATA[计算器程序，非递归实现
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

void calculateAndOutput(char* str);
int isspace(int x)
{
	if(x == ' '|| x == '\t' ||]]></description><category></category></item><item><title><![CDATA[字符串转化为数字]]></title><link>https://blog.csdn.net/furney/article/details/7982081</link><guid>https://blog.csdn.net/furney/article/details/7982081</guid><author>furney</author><pubDate>Sat, 15 Sep 2012 14:29:35 +0800</pubDate><description><![CDATA[将给定字符串转化为数字，如果结果为正较大返回2147483647，如果结果为负且较大返回-2147483648。字符串除包含数字外还包含空格及其他字符，因此需要对不是数字的字符进行处理。
#include  

int isspace(int x)
{
    if(x == ' '|| x == '\t' || x == '\n' || x == '\f' || x == '\b' || x]]></description><category></category></item><item><title><![CDATA[循环链表模板类]]></title><link>https://blog.csdn.net/furney/article/details/7672377</link><guid>https://blog.csdn.net/furney/article/details/7672377</guid><author>furney</author><pubDate>Mon, 18 Jun 2012 11:38:42 +0800</pubDate><description><![CDATA[相对于单链表，循环链表的最后一个结点的next指针指向表头元素，而且每个结点还包含指向其前驱结点的prev指针。链表第一个结点的prev指针是链表的头结点，表头结点的prev指针指向链表最后一个结点。循环链表的插入和删除操作需要注意各指针的变化顺序，否则容易造成结点混乱。另外对循环链表来说，更容易找到指定结点的前驱。
/*
 * 循环链表模板类
 */
#ifndef _DOUBLE_LIST_]]></description><category></category></item><item><title><![CDATA[GVim智能补全clang]]></title><link>https://blog.csdn.net/furney/article/details/7661872</link><guid>https://blog.csdn.net/furney/article/details/7661872</guid><author>furney</author><pubDate>Thu, 14 Jun 2012 10:18:37 +0800</pubDate><description><![CDATA[GVim编辑器结合auto-complete插件实现的代码自动补全虽然能满足一定的需求，但是其依赖tags，不能实现动态的代码补全。clang的出现打破了这一补全模式，其信赖于底层的llvm对代码解析，形成抽象语法树，进而进行补全。因此clang的补全效果非常好，而且补全较准确。
１、安装clang
使用clang之前需要安装代码解析包，我使用的是Ubuntu系统，可以通过sudo apt-g]]></description><category></category></item><item><title><![CDATA[单链表模板类]]></title><link>https://blog.csdn.net/furney/article/details/7657370</link><guid>https://blog.csdn.net/furney/article/details/7657370</guid><author>furney</author><pubDate>Tue, 12 Jun 2012 20:57:54 +0800</pubDate><description><![CDATA[链表是最基本的数据结构，是一组不连续的数据的集合，链表中每个结点除包含结点元素外，还包含下一结点的地址。对链表可以实现插入、删除、查找以及显示等操作。


/*
 * 单链表模板类List.h
 */ 
#ifndef _LIST_H_
#define _LIST_H_

#include 
using namespace std;

template 
class List
{
publi]]></description><category></category></item><item><title><![CDATA[数据结构小总]]></title><link>https://blog.csdn.net/furney/article/details/7621646</link><guid>https://blog.csdn.net/furney/article/details/7621646</guid><author>furney</author><pubDate>Thu, 31 May 2012 22:19:25 +0800</pubDate><description><![CDATA[1、栈和队列的区别
栈是限定只能在表的一端进行插入和删除操作的线性表。 
队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。 
从"数据结构"的角度看，它们都是线性结构，即数据元素之间的关系相同。但它们是完全不同的数据类型。

除了它们各自的基本操作集不同外，主要区别是对插入和删除操作的"限定"。 栈和队列是在程序设计中被广泛使用的两种线性数据结构，它们的特点在于基本操作的]]></description><category></category></item><item><title><![CDATA[看到这篇比较windows和linux的文章，突然一阵莫名的无助]]></title><link>https://blog.csdn.net/furney/article/details/7613507</link><guid>https://blog.csdn.net/furney/article/details/7613507</guid><author>furney</author><pubDate>Tue, 29 May 2012 17:24:56 +0800</pubDate><description><![CDATA[今天在csdn论坛上看到一篇文章，感觉还不错，所以转载到博客中，对于文中观点不作评论。以下是文章正文内容：
原文地址：http://topic.csdn.net/u/20120528/21/f845ab95-5105-4108-aeda-6f1aa979309b.html?19308
有个朋友看我半年没有用 Windows，有时就会问我："你只用 Linux，有没有发现有些 Windows 能]]></description><category></category></item><item><title><![CDATA[教你如何迅速秒杀掉：99%的海量数据处理面试题]]></title><link>https://blog.csdn.net/furney/article/details/7572515</link><guid>https://blog.csdn.net/furney/article/details/7572515</guid><author>furney</author><pubDate>Wed, 16 May 2012 14:30:32 +0800</pubDate><description><![CDATA[前言

   一般而言，标题含有“秒杀”，“99%”，“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌，但进一步来讲，如果读者读罢此文，却无任何收获，那么，我也甘愿背负这样的罪名，:-)，同时，此文可以看做是对这篇文章：十道海量数据处理面试题与十个方法大总结的一般抽象性总结。

    毕竟受文章和理论之限，本文将摒弃绝大部分的细节，只谈方法/模式论，且注重用最通俗最直白的语言阐述相关问]]></description><category></category></item><item><title><![CDATA[Linux程序设计——套接字]]></title><link>https://blog.csdn.net/furney/article/details/7569173</link><guid>https://blog.csdn.net/furney/article/details/7569173</guid><author>furney</author><pubDate>Wed, 16 May 2012 12:29:10 +0800</pubDate><description><![CDATA[进程间通信的机制包括信号量、共享内存、管道和消息队列等，但是这些机制只能实现在一台计算的进程间通信。本文将介绍另外一种进程间通信的机制——套接字，可以实现计算机网络中的通信。
1、套接字
套接字是一种通信机制，通过使用这种通信机制，客户/服务器系统的开发既可以在本地单机上进行，也可以跨网络进行。套接字明确地将客户和服务器区分开来，可以实现将多个客户连接到一个服务器。
2、套接字连接
套接字]]></description><category></category></item><item><title><![CDATA[Linux程序设计——信号量、共享内存和消息队列]]></title><link>https://blog.csdn.net/furney/article/details/7549563</link><guid>https://blog.csdn.net/furney/article/details/7549563</guid><author>furney</author><pubDate>Tue, 15 May 2012 15:38:22 +0800</pubDate><description><![CDATA[1、信号量
多线程程序中总有一部分临界代码，编程人员必须确保只有一个进程可以进入临界代码并拥有对资源的独占式访问权。使用信号量机制可以确保进程之间的并发执行。信号量是一个特殊的变量，只允许对它进行等待(wait)和发送信号(signal)这两种操作，即PV操作：
P——用于等待
V——用于发送信号
》》》PV操作的定义
P(sv)——sv > 0，sv -= 1。sv = 0挂起进程的执]]></description><category></category></item><item><title><![CDATA[Linux程序设计——进程间通信：管道]]></title><link>https://blog.csdn.net/furney/article/details/7542250</link><guid>https://blog.csdn.net/furney/article/details/7542250</guid><author>furney</author><pubDate>Wed, 09 May 2012 09:52:49 +0800</pubDate><description><![CDATA[使用信号在进程间通信，传送的信息只限于一个信号值。更多的数据交换需要使用一种新的机制——管道。管道（pipe）把一个进程的输出连接到另一个进程的输入。
对shell命令的连接就是通过管道实现的，使用管道符号"｜"连接。
1、进程管道
使用popen和pclose创建和关闭管道。popen允许一个程序将另一个程序作为新进程启动，并可以传递数据给它或者通过它接收数据。

#include]]></description><category></category></item><item><title><![CDATA[Linux安装中文输入法并设置开机启动]]></title><link>https://blog.csdn.net/furney/article/details/7535935</link><guid>https://blog.csdn.net/furney/article/details/7535935</guid><author>furney</author><pubDate>Fri, 04 May 2012 20:54:27 +0800</pubDate><description><![CDATA[英文版Linux系统初始安装是没有中文输入法的，因此需要另外下载安装，而且下载安装好的中文输入法在开机时默认不启动。下面将介绍如何安装中文输入法，并设置为开机自动 启动。
1、五笔输入法
sudo apt-get install ibus-table-wubi
2、拼音输入法
在软件中心搜索sunpinyin，安装ibus-sunpinyin
3、将ibus设置成开机启动

Syst]]></description><category></category></item><item><title><![CDATA[Linux程序设计——POSIX线程]]></title><link>https://blog.csdn.net/furney/article/details/7498572</link><guid>https://blog.csdn.net/furney/article/details/7498572</guid><author>furney</author><pubDate>Mon, 30 Apr 2012 13:59:45 +0800</pubDate><description><![CDATA[在Linux中，进程控制系统几乎所有的活动，是系统很重要的组成部分。Linux系统同时支持通过进程创建新的进程，但是创建新进程的代价较高，因为新进程有自己的数据空间、环境和文件描述符。因此，如果想让一个进程同时做两件事件，那就需要线程发挥作用。
线程是一个进程内部的控制序列，所有进程都至少有一个执行线程。当在进程中创建一个新的线程时，新的执行线程将拥有自己的栈，但与它的创建者共享全局变量、文件描]]></description><category></category></item></channel></rss>