自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 资源 (4)
  • 收藏
  • 关注

原创 基于自主开发Web服务器的校内成绩查询系统

基于自主开发Web服务器的校内成绩查询系统好长时间没写博客了,大概是因为个人文笔太烂吧。。。不过最近做了个项目,自己开发的http服务器,后台可以配置不同的CGI模块实现不同的功能。代码托管在github上:点我查看 描述如下: * 主要实现了GET方法; * 传输层和网络层使用TCP/IP协议,应用层使用http协议,并使用socket相关函数实现; * 启动服务器时 * 可以直接输入

2016-03-16 22:33:37 2102 1

原创 《高质量的C/C++编程指南》读书笔记

笔记

2015-08-30 17:20:46 1335

原创 《C陷阱与缺陷》读书笔记

笔记

2015-08-28 11:33:06 971

原创 密码管理神器

密码管理神器

2015-04-10 23:15:33 987

原创 lua学习笔记.md

lua也是一门强大的语言,现将学习笔记简要记录如下:变量lua中的变量默认总是全局的,除非用local声明它。变量没有类型,值才有类型。一个变量在未使用时它的值为nil,同理可将一个已经使用完毕的变量赋值为nil,就删除了这个变量。类型 lua中总共有8种类型,如下: 类型 描述 nil 该类型的值只有一个,即nil boolean 布尔类型,有true和false两种值

2017-05-03 18:52:01 507

原创 继承体系下C++对象模型.md

一直对C++继承体系中对象的内存分布和实现原理不甚了解,故花了点时间复习整理了一下,如下:C++的继承关系可分为如下几种情况:单一的一般继承(带成员变量,虚函数,虚函数覆盖)多重继承(带成员变量,虚函数,虚函数覆盖)菱形继承(带成员变量,虚函数,虚函数覆盖)菱形虚拟继承(带成员变量,虚函数,虚函数覆盖)下面分别来讨论:单一的一般继承这个没什么好说的,基类中有虚函数,所以编译器为其产生了虚表

2017-05-03 18:35:27 391

原创 虚拟存储器

今天上午看了《深入理解计算机系统》中关于虚拟存储器的章节,记录如下:首先说为什么要有虚拟存储器我个人觉得虚拟存储器的概念是和进程概念一起出现的。在计算机技术发展的早期,只有单道批处理系统,特点是一次只能运行一个进程,只有运行完毕后才能将下一个进程加载到内存里面,所以进程的数据都是直接放在物理内存上的。到后来发展出了多道程序系统,它要求在计算机中存在着多个进程,处理器需要在多个进程间进行切换。这时候就

2016-08-17 09:16:36 2502

原创 浅剖智能指针----auto_ptr

刚刚在复习的时候遇到了智能指针,就一时兴起去找出了智能指针的源码看了看,现将我对auto_ptr的理解记录如下: Linux下,auto_ptr源码在/usr/include/c++/4.4.7/backword/auto_ptr.hauto_ptr本身是一个模板类,封装了一个原生指针。它最大的特点是在拷贝构造、赋值、传参等过程中对原生指针控制权的转移,即会将自己所管理的指针release掉,并赋

2016-08-12 09:47:46 479

原创 浅谈STL

由于我刚开始学习系统的写博客,个人方面不管是能力还是经验都会有所欠缺,所以肯定会有很多不完善的地方,包括结构安排、要点遗漏、知识错误等等,还请各位批判着看,如有问题,恳请斧正,我将十分感激!STL是一个标准规范,它只是为各种组件定义了一系列统一的访问接口及他们之间搭配使用的一般规则,而没有规定他们的底层实现。因此各开发商都提供自己的STL版本,比较著名的有P.J. Plauger,HP,SGI等。如

2016-08-11 16:13:57 794

原创 所有HTTP返回码

1xx消息:请求已被接受,需要继续处理。HTTP/1.0协议中没有定义任何1xx状态码。 100 Continue 客户端应当继续发送剩余请求。 101 Switching Protocols 服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。 102 Processing 处理将被继续执行。2xx成功:请求已成功被服务器接收、理解并接受。

2016-08-11 16:07:55 4967

原创 一个简单的Vector实现

众所周知,STL库以高效而闻名。而且使用它可以很方便的实现我们的主要逻辑,不需要关心各种底层的实现细节。本文模拟实现了一个简单的vector容器。关于vector的介绍请移步:浅谈STL。 代码如下:#ifndef _VECTOR_#define _VECTOR_#include<iostream>#include<assert.h>#include<memory.h>using name

2016-08-11 15:44:14 1823

原创 一个简单的List实现

list和vector是STL库中两个最基本的容器,以下代码模拟实现一个简单的list:#ifndef _MYLIST_#define _MYLIST_#include<iostream>using namespace std;class ListIsEmpty{};class ArgIsIll{};template<typename T>class Node{public: No

2016-08-11 15:43:10 767

原创 一个简单的Heap实现

以下代码实现了一个堆,可以传入仿函数来决定生成最大堆或最小堆。#ifndef _HEAP_#define _HEAP_#include"../Vector/Vector.h"#include<string>using namespace std;template<typename T>class Less{public: bool operator()(const T& t1,co

2016-08-11 15:42:09 760

原创 一个简单的Stack实现

stack的特性不用多说了吧,先进后出。底层可以用vector或list实现。#define _STACK_#include<iostream>#include"../List/MyList.h"using namespace std;class StackIsEmpty{};template<typename T>class MyStack{public: MyStack():my

2016-08-11 15:41:00 1146

原创 一个简单的Deque实现

一个双向队列,底层使用list实现,因为list在push_back,push_front,pop_back,pop_front这些函数中效率较高。#ifndef _DEQUE_#define _DEQUE_#include<iostream>#include"../List/MyList.h"template<typename T>class Deque{public: Deque

2016-08-11 15:39:31 833

原创 一个简单的优先级队列实现

优先级队列底层使用堆来实现。因为堆可以在O(1)的时间内找出优先级最高的元素。 代码如下:#ifndef _PRIORITY_#define _PRIORITY_#include<iostream>#include"../Heap/Heap.h"using namespace std;template<typename T,typename U>class PriorityQu

2016-08-11 15:37:59 1443

原创 一个简单的哈希表实现

哈希算法可以说是效率比较高的一种算法了,基本上时间复杂度为O(1)。但哈希有个坑爹的地方就是冲突的问题。当发生冲突时,有两种解决办法: * 线性探测 * 哈希桶法具体算法不再解释,以下代码使用STL中vector和list实现了一个基于哈希桶的哈希表。 代码如下:#pragma once#include<iostream>#include<vector>#include<list>usi

2016-08-11 15:36:33 886

原创 一个简单的二叉树实现

众所周知,二叉树是一种很重要的数据结构,基于二叉树的哈夫曼树可用于文件压缩,BSTreet、AVLTree可用于排序,RBTree被广泛用在STL中的map,set等容器上和Java中的TreeSet和TreeMap上。 二叉树的节点结构:template<typename T>struct BinaryTreeNode{ T _data; BinaryTreeNode<T>*

2016-08-11 15:24:09 1917

原创 一个简单的二叉搜索树实现

上一篇文章简单实现了一个普通的二叉树,参见这里。 二叉搜索树是二叉树的一种变体,它相比普通二叉树的特性就是里面的数据都是有序的,中序遍历它就可以得到一个升序数组。BSTreet实现代码如下:#pragma onceinclude<iostream>using namespace std;template<typename T> struct BSTreeNode { T _data;

2016-08-11 15:23:20 1105

原创 一个简单的AVL树实现

上一篇文章实现了一个最简单的二叉搜索树,里面理由两个成员函数:插入和中序遍历。我觉得,插入应该算是BSTreet中最核心的一个函数了。 二叉搜索树虽然是一颗排序树,但当数据的插入顺序基本逆序时,BSTreet就退化为一个很近似链表的结构。而链表中查找的时间复杂度为O(n),显然这失去了二叉搜索树O(lgN)的优势。 因此我们可以对BSTree进行改进,使之成为一个平衡的二叉搜索树,即AVL树。

2016-08-11 15:22:29 781

原创 冒泡排序

冒泡排序可以说是最简单的一种排序了,其核心思想是: * 每次比较相邻的两个数,若后面的比前面大,则交换之; * 重复以上步骤,直到所有数都有序为止。代码如下:template<typename T>void BubbleSort(vector<T>& v){ int length=v.size(); int i,j; for(i=0;i<length;++i)

2016-08-11 15:21:35 614

原创 选择排序

我个人认为冒泡排序和选择排序真是一对孪生兄弟,因为我总感觉这两个算法的思想很像,时间复杂度也相同。但其实他们的算法思想是不同的。冒泡排序是从前往后逐个比较相邻的元素,从而使得最大的元素”冒”到数组的最右边。 而选择排序则是将某一个元素与其余所有元素相比较,选出一个最小/最大的元素放在当前位置。 代码如下:template<typename T>void SelectSort(vector<T>

2016-08-11 15:20:47 411

原创 求给定数组的最大子数组

话说前天晚上被网易虐的也是够惨,3道编程题做出来两道,一个运行超时,一个通过率为70%。其实考的是动态规划之类的东西,只可惜我当时没有好好学。虽然牛客网服务器挂了导致考试延长一个小时,但这对我并没有什么实质帮助,不会还是不会呀。 今天开始啃《算法导论》,每天一个算法,坚持! 简单看了下分治这一节,照着书上的思想敲出了”给定数组的最大子数组”的代码,如下:int FindMidMaxSum(con

2016-08-11 15:17:34 524

原创 KMP算法

众所周知,KMP算法的作用是匹配字符串,比如在一个文本编辑器中查找符合某一模式的所有字符等。 就我认为,这个算法还是比较难的,反正我是看了好长时间都没懂,哈哈~ 昨天说了,每天一个算法,坚持下去! 今天看了《算法导论》中关于该算法的部分,对求next数组部分不是特别理解,参考了网上的某些文章,不过他这篇文章的分析确实不错,但代码部分有些缺陷,我已改正过来。简要记录如下:普通的暴力匹配算法是将模

2016-08-11 15:16:16 314

原创 红黑树

当我们在使用二叉搜索树时,如果树的高度较高,对其的操作并不比对链表操作要快。原因是二叉搜索树在插入顺序基本有序时会退化为一个排序链表,所以说是不平衡的。对二叉搜索树的改进有AVL树和红黑树。先来看红黑树,它广泛应用在STL的set和map,Java库和Linux内核等中 。红黑树是一颗平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是RED或BLANK。通过对任何一条从根节点到

2016-08-11 15:09:17 465

原创 B树

B树是为磁盘或其他直接存取的辅助存取设备而设计的一种多叉平衡搜索树,类似于红黑树,但B树在降低磁盘I/O操作方面要更好一些。许多数据库系统使用B树或B树的变种来存储信息。 我们知道,磁盘I/O是很慢的,因为要涉及到磁头寻道、定址和数据读取时间。寻道是一种机械运动,速度自然慢;定址的平均时间是磁盘旋转周期的一半,目前主流磁盘旋转速度是5400RPM,快一点的也是7200RPM,尽管如此,旋转一圈需要

2016-08-11 15:06:36 340

原创 死锁

当一个系统中多个进程对某些临界资源进行访问时,就有可能发生死锁。所谓死锁,就是多个进程都请求某些资源,而这些资源都由这组进程中的其他进程所保持,这样他们都持有自己的资源而又等待别的进程释放资源的状态。 发生死锁的充分必要条件是:互斥条件:即进程对临界资源的访问时互斥的,不能同时又两个或以上的进程同一访问某一资源。循环等待条件:每个进程都在等待其他进程释放自己所请求的资源。请求和保持条件:每个

2016-08-11 15:02:57 421

原创 进程相关知识

进程相关

2016-08-11 15:00:12 738

原创 面试题22:栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入序列,序列4,5,3,2,1,是该压栈序列对应的一个弹出序列。但4,3,5,1,2就不可能是该压栈序列的弹出序列。分析栈是一种“后进先出”(LIFO)的数据结构,所以元素的出进顺序都是有相对关系的。对应于题目中的例子,当入栈序列为1,2,3,4

2016-06-11 11:06:08 523

原创 面试题21:包含min函数的栈

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop函数的时间复杂度都是O(1)。分析栈应该是我们很熟悉的一种数据结构了,它是一种“后进先出”的数据结构,并且只能在栈的一端(栈顶)进行操作。所以其push和pop操作的时间复杂度都是O(1)。如果题目没有要求min函数的时间复杂度的话,我们可以在min函数里面遍历所有的元素并将其保存起来

2016-06-11 11:05:45 502

原创 面试题20:顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入如下矩阵:1      2      3     4 5      6      7     8 9     10    11   12 13   14    15   16则依次打印出数字:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.分析从题意中可以看出来,打印顺序是从左上角开始以

2016-06-11 11:05:25 782

原创 面试题19:二叉树的镜像

题目:请完成一个函数,输入一个二叉树,输出它的镜像。二叉树的节点定义如下:struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; BinaryTreeNode(int data=int()):value(data),left(NULL),right(NULL)

2016-06-11 11:05:01 623

原创 面试题18:树的子结构

题目:输入两颗二叉树A和B,判断B是不是A的子结构。二叉树的节点定义如下:struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; BinaryTreeNode(int data=int()):value(data),left(NULL),right(NULL)

2016-06-11 11:04:40 332

原创 面试题17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。链表的定义如下:struct ListNode{ int value; ListNode* next; ListNode(int data=int()):value(data),next(NULL) {}};分析这是典型的链表归并问题。因为两个链表都是排好序的,所以我们只需要初始

2016-06-11 11:04:15 356

原创 面试题16:反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表定义如下:struct ListNode{ int value; ListNode* next; ListNode(int data=int()):value(data),next(NULL) {}};此题可以用递归和头插法来做。递归用递归做起来稍微复杂一点,而且会有个问题,就是当

2016-06-11 11:03:50 640

原创 面试题15:链表中倒数第K个节点

题目:输入一个链表,输出该链表中倒数第K个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。链表的定义如下:struct ListNode{ int value; ListNode* next; ListNode(int data=int()):value(data),next(NULL) {}};分析有三种方法:递归法,自定义栈法

2016-06-11 11:03:08 947

原创 面试题14:调整数组顺序使奇数位于偶数前面

题目:输入一个整数数组,实现一个函数来调整数组中数字的顺序,是得所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。分析最简单的办法就是开辟和原数组同样大小的空间,顺次扫描原数组2次,第一次将所有奇数放进新数组中,第二次将偶数放入就可以。这种方法的时间复杂度为O(n),空间复杂度为O(n)。代码如下:void ReorderOddEven(vector<int>& arr){ ve

2016-06-11 11:02:46 3485

原创 面试题13:在O(1)时间 内删除链表节点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。链表节点与函数的定义如下:struct ListNode{ int value; ListNode* next;}void DeleteNode(ListNode* head,ListNode* pToBeDeleted);分析在单向链表中删除一个节点,通常的做法是从链表头开始遍历,如果某个节点的

2016-06-11 11:02:18 1977

原创 面试题12:打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3一直到最大的3位数即999.分析要打印1到最大的n位数,我们首先想到的方法是先计算出n,再逐次打印。但有一个很重要的问题,n大于9怎么办?(MAX_INT=2147483647,10位),这样要打印的数字就会超过整型可以表示的范围,所以说这是一个隐形的大数问题。通常都是用字符串来解决大数问题的,所以我们在字符串上来模

2016-06-11 11:01:56 486

原创 面试题11:数值的整数次方

题目:请实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。分析恩,很简单。我们写出的代码如下:double Power(double base,int exponent){ double res=1; int i; for(i=0;i<exponent;++i)

2016-06-11 11:01:19 342

密码管理神器

一款密码管理工具,让你再也不用记密码,真正解放!

2015-09-02

俄罗斯方块

一个简单的俄罗斯方块游戏,不是很完善,以后会慢慢改进的,欢迎下载!

2015-05-21

贪吃蛇游戏

写的贪吃蛇小游戏,练练手,欢迎下载试玩。

2015-04-15

贪吃蛇小游戏

写的贪吃蛇小游戏,练练手,欢迎下载试玩。

2015-04-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除