苏嵌学习
believe_s
这个作者很懒,什么都没留下…
展开
-
设计模式之抽象工厂
概念: 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。模式中包含的角色及其职责: 抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。 具体工厂( Concrete Creator)角色原创 2017-11-14 10:56:29 · 632 阅读 · 0 评论 -
数据结构排序法之希尔排序法(Shell Sort)
希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本。希尔排序是不稳定的排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝翻译 2017-08-03 23:25:01 · 941 阅读 · 0 评论 -
数据结构之顺序表(二)
顺序表原创 2017-07-23 02:17:42 · 299 阅读 · 0 评论 -
多线程编程
一、线程的概述1、什么是线程: 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属于一个进程的其他的线程共享进程拥有的全部资源。2、进程和线程的区别 Linux进程创建一个新线程时,线程将拥有自己的栈(因为线程有自己的局部变量)原创 2017-08-17 15:29:06 · 249 阅读 · 0 评论 -
wait( )和 waitpid( )
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止原创 2017-08-10 14:19:02 · 969 阅读 · 0 评论 -
数据结构排序法之堆排序he归并排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。原创 2017-08-07 01:33:40 · 442 阅读 · 0 评论 -
浅谈三种特殊进程:孤儿进程,僵尸进程和守护进程
昨天学了进程控制,就这三种特殊的进程研究了一下,其中也借鉴了一些前人总计的经验。1、孤儿进程2、僵尸进程3、守护进程原创 2017-08-10 12:23:29 · 4065 阅读 · 0 评论 -
进程间通信之分别用共享内存和信号量实现卖票
利用共享内存实现的卖票系统: 利用flag来保证同一时间只有一个程序使用内存,使用结束还原。#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <string.h>#include <time.h>typedef struct _shm{ int fla原创 2017-08-17 15:27:36 · 297 阅读 · 0 评论 -
进程间通信之消息队列
一、什么是消息队列 unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便。消息队列(也叫做报文队列)则克服了这些缺点。消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式。 进程可以向其中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。消息队列分两种: POSIX消息队列以及系统V消息队列 系统V消息队原创 2017-08-17 15:06:48 · 278 阅读 · 0 评论 -
umask命令:设置文件的默认权限掩码
文件权限是linux系统中的一种安全机制,通过设置不同的权限,可以达到限制用户操作的目的,有效地保证了文件的完整性。 默认的情况下,创建一个文件的权限为”rw-r–r–”,而创建一个目录的权限为rwxr-xr-x”,如果默认的不符合用户的需求,可以用chmod命令进行设置,但这样的效率很低。linux提供了一个方便的工具umask,可以用来设置文件的默认掩码。转载 2017-08-10 01:02:54 · 5731 阅读 · 0 评论 -
数据结构之顺序表(一)
有关顺序表,由于代码太长,我将分成2部分,这边是头文件SeqList.h和主函数:原创 2017-07-23 02:15:01 · 415 阅读 · 0 评论 -
数据结构之头指针链表de三种插入方式(头插法,尾插法,在pos处插入)
1、头插法:流程:1 ,判断传入数据是否正确 2,如果正确则创建一个新的节点,并判断节点是否创建成功 3,然后给节点成员变量赋值 4,最后让新节点变为链表的第一个节点。 2、尾插法:流程:1,首先判断传入数据是否正确 2,如果正确则创建一个新的节点并判断节点是否创建成功 3,然后给成员变量赋值 4,找到最后一个节点(创建一个tmp指向第一个节点,遍历整个链表,最终指向最后一个节点),寻找最后一个节点时原创 2017-07-24 23:15:52 · 4077 阅读 · 0 评论 -
设计模式之单例模式
作用:保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象 构造图如下: 为什么需要单例模式: 1、在多个线程之间,比如初始化一次socket资源 2、在整个程序空间使用全局变量,共享资源 3、大规模系统中,为了性能的考虑,需要节省对象的创建时间 实现步骤: 1、构造函数私有化 2、提供一个全局的静态方法(全局访问点) 3、在类原创 2017-11-13 22:27:18 · 527 阅读 · 0 评论 -
设计模式之工厂模式
一、简单工厂模式静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 模式中包含的角色及其职责: 1.工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。 2.抽象(Product)角色 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共原创 2017-11-14 09:39:50 · 515 阅读 · 0 评论 -
设计模式之开放封闭原则
以下皆是个人理解如有不对请留言指出,谢谢! 我就代码提出我自己个人的看法: 正常定义一个对象开放封闭原则实例:#include using namespace std;class BankWorker{public: void payM() { cout "付款" << endl; } void saveM() {原创 2017-11-13 15:50:55 · 584 阅读 · 0 评论 -
设计模式之创建者模式
设计模式的基本原则设计模式体现的是软件设计的思想,而不是软件技术,它重在使用多态与抽象类来解决各种问题开放封闭原则:类的改动是通过增加代码进行的,而不是修改源代码依赖倒置原则:依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程接口隔离原则:不应该强迫客户的程序依赖他们不需要的接口方法。一个接口应该只提供一种对外功能里氏替换原则:任何抽象类出现的地方都可以用他的实现类进行替换。实原创 2017-11-12 23:18:55 · 578 阅读 · 0 评论 -
设计模式之依赖倒置原则
在传统的过程式中,上层依赖于底层,当底层变化,上层也得跟着做出相应的变化。这就是面向过程的思想,弊端就是导致程序的复用性降低并且提高了开发的成本。 而面向对象的开发则很好的解决了这个问题,让用户程序依赖于抽象层,实现层也依赖于抽象层,而抽象层一般不会轻易变化。即使实现变化,只要抽象不变,客户程序就不用变化,这大大降低了客户程序与实现细节的耦合度。就好比实例中电脑由硬盘、CPU、内存组成,而这些硬件原创 2017-11-13 15:57:05 · 603 阅读 · 0 评论 -
进程控制常用的一些操作
1、获取进程的idint main0(){ printf ("当前进程 ID %d\n", getpid()); printf ("当前父进程:%d\n", getppid()); printf ("当前用户: %d\n", getuid()); while (1); return 0;}2、fork 和 vfork之前的博客里有,这里就不啰嗦了原创 2017-08-10 14:35:45 · 383 阅读 · 2 评论 -
Linux 文件系统编程之系统调用和标准I/O库
系统调用访问设备驱动程序的底层函数主要有:open:打开文件或者设备。read:从打开的文件或者设备里面读取数据。write:向文件或者设备写数据。close:关闭文件或者设备。常用标准I/O库文件函数:fopen,fwrite,fread,fclose,fflush,fseek,fgets,getchar,fputs等系列的函数原创 2017-08-09 19:37:20 · 332 阅读 · 0 评论 -
数据结构之顺序栈的一些基本操作
**顺序栈可以用一个一维数组和一个记录栈顶位置的整形变量来实现,数组用于顺序存储栈中所有的数据元素,栈顶指针用于存储栈顶元素的位置。**原创 2017-07-28 00:21:58 · 689 阅读 · 0 评论 -
数据结构之头结点链表的三种插入方式(头插法,尾插法,在pos处插入)
创建头结点,头插法,尾插法,在pos处插入数据原创 2017-07-25 14:53:46 · 8220 阅读 · 0 评论 -
数据结构之单链表(头结点)的一些常用操作(增删改查逆)
删除指定结点,逆序, 删除数据,查找元素, 获取顺序表中的元素:通过位置获取,获取长度,清除列表,输出显示,销毁链表原创 2017-07-25 14:50:37 · 889 阅读 · 0 评论 -
数据结构之头指针链表的逆序、输出和指定位置的删除
头指针链表指定位置的删除 头指针链表的逆序实现头指针链表的输出原创 2017-07-25 01:52:39 · 710 阅读 · 0 评论 -
进程间通信之信号he信号量
信号的篇幅较少,就把他和信号量放在一起了。先讲讲他们之间的区别: 1.信号:(signal)是一种处理异步事件的方式。信号时比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。linux除了支持unix早期的信号语义函数,还支持语义符合posix.1标准的信号函数sigaction。2.信号量:(Semaphore)进程间通信处理同步互斥的机制。原创 2017-08-17 11:23:16 · 518 阅读 · 0 评论 -
进程间通信之共享内存
共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。 共享内存实现分两个步骤: 1、创建共享内存,使用shmget函数 2、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。原创 2017-08-17 10:09:48 · 375 阅读 · 0 评论 -
李洋疯狂C语言之选择排序
选择排序法 原理: 选择法循环过程与冒泡法一致,它还定义了记号min=i,然后依次把a[min]同后面的元素比较,若a[min]>a[j],则使k=j. 最后看看k=i是否还成立,不成立则交换a[k], a[i],这样就比冒泡法省下许多无用的交换,提高了效率。原创 2017-07-12 23:57:24 · 285 阅读 · 0 评论 -
李洋疯狂C语言之冒泡排序法
冒泡排序的2种写法原创 2017-07-12 22:26:39 · 293 阅读 · 0 评论 -
栈在表达式计算过程中的应用
栈在表达式计算过程中的应用 :建立操作数栈和运算符栈。运算符有优先级。 规则: 自左至右扫描表达式,凡是遇到操作数一律进操作数栈。 当遇到运算符时,如果它的优先级比运算符栈栈顶元素的优先级高就进栈。反之,取出栈顶运算符和操作数栈栈顶的连续两个操作数进行运算,并将结果存入操作数栈,然后继续比较该运算符与栈顶运算符的优先级。原创 2017-07-31 23:12:06 · 4267 阅读 · 1 评论 -
数据结构之顺序队列和链式队列常用的一些操作
顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表。和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素。由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应设置为0。原创 2017-07-31 23:09:05 · 425 阅读 · 0 评论 -
数据结构之链式栈的一些基本操作
链式栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。原创 2017-07-31 22:57:18 · 5252 阅读 · 0 评论 -
数据结构之树的一些基本操作
树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。原创 2017-08-01 23:52:35 · 2200 阅读 · 1 评论 -
数据结构之二叉树的一些基本操作
二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。原创 2017-08-02 01:04:25 · 669 阅读 · 0 评论 -
数据结构排序法之插入法
插入排序是一种简单直观的排序算法。它的工作原理非常类似于我们抓扑克牌。对于未排序数据(右手抓到的牌),在已排序序列(左手已经排好序的手牌)中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。翻译 2017-08-03 23:46:46 · 1157 阅读 · 0 评论 -
数据结构排序法之鸡尾酒排序法he快速排序法
鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进。此算法与冒泡排序的不同处在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能。快速排序对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。原创 2017-08-04 00:05:53 · 481 阅读 · 0 评论 -
李洋疯狂C语言之n个人报数,报到3的退出,最后留在场上的是原来的第几位(约瑟夫环)
n个人报数,报到3的退出,最后留在场上的时原来的第几位 (约瑟夫环)原创 2017-07-16 01:53:01 · 2787 阅读 · 1 评论 -
好久没敲代码了(强行补上今天的博客。。。)
流水账日记原创 2017-07-16 00:03:38 · 369 阅读 · 0 评论 -
李洋疯狂C语言之求素数的方法
利用开方求素数的简便方法原创 2017-07-13 00:14:06 · 403 阅读 · 0 评论 -
李洋疯狂C语言之关于自增自减遇到的一些问题
今天讲到自增的时候,遇到个难点,单个的自增自减运算还是挺简单的,但是如果是多个自增自减,就会变得比较麻烦,在windows环境和Linux环境中也会得到不一样的结果原创 2017-07-13 09:24:28 · 714 阅读 · 0 评论 -
进程间通信之管道通信
两个程序之间传递数据的一种简单方法是使用popen和pclose。#include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *stream); popen函数允许一个程序将另一个程序作为新进程来启动,并可以传递数据给它或者通过它接收数据。原创 2017-08-17 09:53:15 · 620 阅读 · 0 评论 -
fork与vfork的区别
fork与vfork的区别 1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。2.fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。转载 2017-08-09 20:17:26 · 224 阅读 · 0 评论