自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lu_1079776757的博客

一名计算机专业的学生

  • 博客(69)
  • 收藏
  • 关注

原创 使用两个栈实现一个队列

      栈是一个非常常见的数据结构,他在计算机领域被广泛应用。栈的特点是先进后出,栈是一个不考虑排序的数据结构。      队列的特点是先进先出,即第一个进去的元素将会第一个出来。      让我们用两个先进后出的栈来实现一个先进先出的队列,那么我们把数据压入第一个栈,此时我们很清楚它的出战顺序是与我们想要的队列的出队顺序是相反的,如果再把这个栈里面的元素依次压入第二个栈,此时我们想想...

2018-08-27 18:09:08 326

原创 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最 小值的操作)的时间复杂度为O(1)

 主要思路:1)建立两个栈_data与_mindata,其中_data作为数据栈,存放每一个入栈的数据;_mindata作为数据最小栈,存放数据栈中当前最小的数据;2)当元素data入栈时,将data入栈到_data数据栈中,并让data与_data的栈顶元素做比较,如果x小于等于_data的栈顶元素,则将data入栈到_mindata最小数据栈中;3)当元素出栈时,让_data与_m...

2018-08-27 17:29:22 515

原创 排序算法总结

排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类:(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。(2)、选择排序:简单选择排序、堆排序。(3)、交换排序:冒泡排序、快速排序。(4)、归并排序(5)、线性时间排序:计数排序、基数排序、桶排序...

2018-07-23 18:35:24 555

原创 冒泡排序算法

什么是冒泡排序呢?冒泡排序的英语名是Bubble Sort,是一种最基础的交换排序。     大家一定都喝过汽水吧,汽水中常常有许多小小的气泡,往上飘,这是因为组成小气泡的二氧化碳比水要轻,所以小气泡才会一点一点的向上浮。而冒泡排序之所以叫冒泡排序,正是因为这种排序算法的每一个元素都可以向小气泡一样,根据自身大小,一点一点向着数组的一侧移动。具体如何移动呢?我们来看一下例子:    有...

2018-07-19 22:31:43 402760 32

原创 操作系统面试题(1)

1、进程和线程的区别?解析:(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元          (2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包含一个线程。          (3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的...

2018-07-18 16:25:08 276

原创 浅谈malloc/free和new/delete的用法与区别

一、malloc/free的用法 两个函数的原型如下,他们都是在stdlib.h中声明。void *malloc(size_t size);void free(void *pointer);实例代码如下:int *p=(int *)malloc(100); //指向整型的指针p指向一个大小为100字节的内存的地址int *p=(int *)malloc(25*size...

2018-07-18 16:03:58 551

原创 动态内存开辟

内存分配有三种方式:1.从静态存储区分配,生命周期随程序的结束而结束,比如说全局变量,static变量2.从栈空间分配,函数调用完成后被自动释放3.从对空间分配,即动态内存开辟,比如malloc,calloc,reallocmalloc、calloc、realloc和free【1】malloc函数原型 :void* malloc(size_t size) 这个函数...

2018-07-18 16:00:46 270

原创 Shell工具(下)

今天我们继续学一些Shell的工具sed    sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。se...

2018-07-10 17:31:20 1418

原创 Shell 工具(上)

    今天我们来学习Shell的一下常用的工具,Shell工具有很多,比如说sort,cut,uniq,xargs等等。今天我们先学习两个简单的工具。sort原则    很明显,我们都知道sort是用来进行排序的。它将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按照ASCII码值进行比较,最后按照升序排列输出。现在我们来看一看sort常见的以下选项。常见选项sort默认的排序...

2018-07-08 11:00:28 1322

原创 Shell 工具(cut)

    今ti我们来学习一下Shell的一些基本工具。

2018-07-05 17:13:54 2133

原创 Shell 正则表达式

    今天我们来学习一下Shell的正则表达式。正则表达式的概念:    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、以及这些特定字符的组合,责成一个“规定字符串”,这个“规定字符串”用来表达对字符串的一种过滤逻辑。规定这些特殊语法表示字符类、数量限定符和位置限定符,然后用这些特殊的语法和普通的字符一起表示一个模式,这就是正则表达式。正则表达式是用于描述一组字符串特征...

2018-07-05 15:57:57 3716

原创 C与C++的区别与联系

本篇博客对C与C++的区别与联系进行了整理。并对一些小的知识点进行了扩展。首先我们先来看一看C/C++的联系C/C++的联系: C是C++的子集,C++兼容大部分的C语言的语法结构C/C++的区别: 我们都知道C是面向过程的语言,而C++是面向对象的语言。那这里我们就要知道什么是面向对象?      面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过...

2018-05-26 21:43:58 2495

原创 C语言实现顺序表

SeqList.h#ifndef __SEQLIST_H__#define __SEQLIST_H__#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<memory.h>typedef int DataType; //顺序表的元素类型#define N ...

2018-04-24 17:12:10 224

原创 守护进程

守护进程首先我们先来认识一下什么是守护进程?认识守护进程    守护进程也称为精灵进程(Daemom),是运行在后台的一种特殊的进程。它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如ftp服务器,ssh服务器,Web服务器等。同时,守护进程完成许多系统任务。比如作业规划crond。     Linux系...

2018-04-17 19:57:46 1113

原创 进程间关系

    今天我们的目标是学习进程间的几个关系:它们分别是进程组/作业/会话。    首先我们谈论第一个话题----进程组。我们先来了解一下它的概念,什么是进程组呢?显而,进程组就是一个或多个进程组成的集合。每个进程除了有一个进程ID之外,还属于一个进程组。进程组(Process Group)    进程组就是一个或多个进程组成的集合。每个进程除了有一个进程ID之外,还属于一个进程组。通常,它们与同...

2018-04-17 17:52:05 410

原创 Linux进程创建、等待、终止以及vfork

进程控制:进程创建:利用fork()创建一个子进程:#include<stdio.h>#include<unistd.h>int main(){ pid_t id = fork(); if(id < 0){ //fork()失败 perror("fork:"); }else if(id == 0){ //child ...

2018-04-16 22:37:37 337

原创 模拟实现进程创建函数process_create

利用fork( )、wait( )等函数模拟实现进程创建函数process_create#include<stdio.h>#include<unistd.h>#include<stdlib.h>typedef void *(*FUNC)(void *); typedef struct Arg{ int reg;} Arg;void* fun...

2018-04-16 18:15:11 567

原创 文件版本的通讯录

之前我们实现了静态通讯录和动态通讯录,今天我们来实现文件版本的通讯录。直接上代码:test.c#include"address_list.h"void address_list(PADDRESS plist)//通讯录主函数{ int input = 0; do { menu2(); printf("请选择:>"); ...

2018-04-16 18:01:59 266

原创 基于链表和环形队列的生产者消费者模型

    今天我们来学习一下生产者消费者模型。首先我先来给大家举一个简单的例子:    日常生活中,当我们缺少某些生活用品时,我们都会去超市进行购买,那么大家有没有想过,你是以什么样的身份去超市的呢?相信大部分人都会说自己是消费者,的确如此,那么既然我们是消费者,又是谁替我们生产这些各种各样的商品呢?当然是超市的各大供货商了,因此他们自然而然的也就成了我们的生产者。这样一来,生产者有了,消费者也有了...

2018-04-12 21:13:08 375 1

原创 模拟实现strcpy

strcpyvoid my_strcpy(char *pdest, char *psrc){ while (*psrc != '\0') { *(pdest++) = *(psrc++); } *pdest = *psrc;}int main(){ char arr[20] = { 0 }; my_strcpy(arr, "hello world"); printf("%...

2018-04-12 19:31:51 173

原创 多线程(2)---(同步&互斥&互斥量)

    上一个博客我们学习了线程的创建,如如何查看线程ID,线程与进程之间的区别等等,可以参考上篇博客线程(1)。而这一篇博客我们继续来学习线程,本篇博客我们的目标是:1、学会线程同步2、学会使用互斥量、条件变量线程同步与互斥mutex(互斥量)    大部分情况下,线程使用的数据都是局部变量,变量的地址空间在栈空间内,这种情况变量属于单个线程,其它线程无法获得这种变量。但是有的时候,很多变量都需...

2018-04-12 19:27:56 296

原创 多线程(1)

        之前我们学习了进程,现在我们又引入了一个新的概念线程,那线程又是什么呢?它和进程间的区别又有哪些呢?本篇博客就介绍了线程的相关知识。让我们一起来看看吧!线程的概念什么是线程呢?    在一个程序里的执行路线就叫做线程(thread)。更准确的来说,线程是一个进程内部的控制序列。。一切进程至少都有一个执行线程。    简言之,线程是代码的一个执行流。进程和线程的区别1、进程是资源竞争...

2018-04-10 16:06:47 301

原创 进程信号(3)

之前我们学习了信号递达和阻塞的基本概念和原理,而今天我们将继续学习信号。本文我们的目标是:    1、掌握信号捕捉的一般方式    2、了解可重入函数的概念    3、了解竞态条件的情景和处理方式    4、了解SIGCHLD信号,重新编写信号处理函数的一般处理机制首先我们先来看一下信号捕捉的一般方式。之前我们提到过信号处理的几个常见的方式:    1、忽略此信号    2、执行该信号的默认处理动...

2018-04-02 18:03:46 286

原创 如何知道一个函数的运行时间

1)头文件ctime里面提供了一个函数:  clock_t clock(); 该函数返回的是从程序开始运行到调用clock函数时所打的点数,即clock tick(时钟打点);2)有一个常数CLK_TCK,是机器时钟每秒所走的时钟打点数,是这样定义的#define CLK_TCK  CLOCKS_PER_SEC # define CLOCKS_PER_SEC 10003) 所以,定义两个clock...

2018-03-29 17:07:53 4214

原创 链表逆置

给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,提示:这个题是链表逆置的升级变型。pNode RotateList(pNode* pHead, DataType k) { pNode pPre = Find(*pHead, k); pPre = ...

2018-03-29 17:02:45 199

原创 求二叉树的高度/销毁一颗二叉树

int HeightOfBinatyTree1(BinaryTreeNode* pRoot) //二叉树的高度{ if (pRoot == NULL) return 0; int m = HeightOfBinatyTree1(pRoot->_pLeft); int n = HeightOfBinatyTree1(pRoot->_pRight...

2018-03-29 17:01:11 284

原创 进程信号(2)

上一篇我们了解了信号的基本概念以及信号的产生方式,而今天我们继续学习信号。本文我们的目标是:    理解信号递达和阻塞的概念和原理首先我们看一下什么是阻塞信号?阻塞信号1、信号其他相关概念        实际执行信号的处理动作称为信号递达(Delivery)        信号递达有三种方式:            1、忽略              2、默认动作              3、自...

2018-03-29 11:27:11 273 1

原创 进程信号(1)

今天我们要来学习一下Linux下的信号。本节目标是:    1、掌握信号的基本概念    2、掌握信号产生的一般方式    现实生活中存在很多信号,比如说红绿灯,闹钟等等。当我们在人行道上走时,遇到了红灯,我们的第一反应就是停下来等待,而我们又为什么会做这个动作呢?是因为我们知道“红灯停,绿灯行”这个交通规则,而这个规则我们已经记住了,因此才会做出这个反应。    那么Linux下的信号的是什么呢...

2018-03-27 20:38:06 255

原创 进程间通信(4) 信号量

之前我们学习了管道,消息队列,共享内存,今天我们再来学一种进程间通信的方式-----信号量信号量    信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。在了解信号...

2018-03-24 19:59:03 267

原创 进程间通信(3) 共享内存

之前我们学习了进程间通信的两种方式------管道&消息队列,而今天我们再来学习一种方式-----共享内存。这时我们就要明白一个概念,什么是共享内存呢?       共享内存就是两个(或多个)进程占有同一段内存空间,这些进程可以是有亲缘关系的进程,也可以是完全不相关的进程。同一块物理内存空间被映射到两个进程,两个进程都可以访问这段共享空间从而实现了进程间通信。但是值得注意的是:Linux的...

2018-03-24 12:14:28 393

原创 进程间通信(2) 消息队列

昨天我们看了进程间通信的一种方式-----管道,那么今天我们继续学习进程间通信的另一种方式----消息队列。消息队列消息队列是由内核维护的一种链式结构。链表中每一个记录又称作消息,消息具有特定的格式和优先级别。    1、消息队列提供了一个从一个进程向另一个进程发送一块数据的方法    2、每个数据块都被认为是有⼀个类型,接收者进程接收的数据块可以有不同的类型值    3、消息队列也有管道⼀样的不...

2018-03-23 19:15:35 327

原创 进程间通信(1) 管道

进程间通信首先我们先来了解一下进程间通信。进程间通信目的:    1.数据传输:一个进程需要将它的数据发送给另一个进程    2.资源共享:多个进程之间共享同一份资源    3.通知事件:一个进程需要向另一个或一组进程发送消息,通知他们发生了某种事件    4.进程控制:有些进程希望完全控制另一给进程的执行(如Debug进程),此时控制希望能够拦截另一个进程的所有陷入和异常,并能够即使知道它的状态...

2018-03-21 21:13:13 392

原创 C语言(九) 深度剖析数据在内存中的存储 (下)

今天我们继续来学习数据在内存中的存储;C/C++程序内存的分配一个由C/C++编译的程序占用的内存分别为一下几个部分:1、栈区(stack)---- 由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。2.   堆区(heap)---- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表。3.   全...

2018-03-04 15:45:20 327

原创 C语言(九) 深度剖析数据在内存中的存储 (上)

   之前我们学习了基本的内置类型:charshortintlongfloatdouble以及它们所占存储空间的大小。类型的意义: 1.使用这个类型开辟内存空间的大小(大小决定了使用的范围) 2.如何看待内存空间的视角类型的归类:整形:char unsigned char signed charshort unsigned short[int] signed short[int...

2018-02-09 22:25:44 997 1

原创 写一个宏可以将一个数字的二进制代码的奇数位和偶数位交换

1、写一个宏可以将一个数字的二进制代码的奇数位和偶数位交换。#include<stdio.h>#include<stdlib.h>#define SWAP(x) (((x&0xaaaaaaaa)>>1)+((x&0x55555555)<<1))int main(){ int a = 10; int ret = SWAP(a...

2018-02-09 13:52:55 314

原创 C语言(八) 指针下

   上节我们看了指针的一部分,今天我们接着来学习指针。指针数组有了之前的概念,我们深入的学习一下。那什么事指针数组呢?指针数组是数组还是指针呢?(指针数组是数组,是一个存放了指针的数组)数组指针概念分析数组指针,是指针。我们已经熟悉了:整形指针:int * pint;能够指向整形数据的指针。                           浮点指针:float * pf;能够指向浮点型数据的...

2018-02-06 14:34:45 182

原创 C语言(八) 指针上

今天我们学习指针,我们现在来了解一下指针它是什么呢?在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需要的变量单元,可以说地址指向该变量单元。因此将地址形象的称为“指针”。意思是通过它能找到以它为地址的内存单元。我们可以这么理解:对应代码如下:#include int main(){ int a

2018-02-06 13:58:13 252

原创 C语言(七) 深度理解函数

首先我们先来复习一下之前学过的函数的基础知识。在简单函数中,我们已经学习了函数的声明和定义,学习了函数的参数、实参、形参、参数的设计,函数的使用等一些知识。函数的调用过程(栈帧)现在我们来深入的研究一下函数的调用过程。先来看一段代码:#include int Add(int x, int y){ int z = 0; z = x + y; return z;}int

2018-02-05 21:42:00 279

原创 计算n的阶乘

1、计算n的阶乘#include<stdio.h>#include<stdlib.h>int main(){ int n = 3; int ret = 1; int i = 0; for (i = 1; i <= n; i++) { ret = ret*i; } printf("%d\n", ret); system("pause"); ...

2018-02-04 23:22:20 696

原创 C语言(六) 数组

今天我们要学习一下C语言中的数组,我们先来简单的看一下一维数组和二维数组的创建以及初始化,还有他们的使用。一维数组的创建和初始化数组的创建数组是一组相同的类型元素的集合。数组的创建方式:type_t arr_name [const_n];//type_t 是指数组的元素类型//const_n 是一个常量表达式,用来指定数组的大小数组的创建实例://代码1i

2018-02-04 22:11:56 448

空空如也

空空如也

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

TA关注的人

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