C++编程知识点总结

C++

  1. 不管啥语言,数组定义中等号左边括号内如果有则必须为常数,不能是变量名(你想想要是这句代码后面变量值变了咋办,数组长度不能改)
    define是设置常量,之后不能更改
对于指针来说,在没有进行初始化下都不可以进行操作(++或- -),因为是野指针
结构体对齐规则

A.计算结构体大小不是元素单纯相加;
B.32位CPU取四个字节比一个字节更高效方便;
C.若每个元素首地址都是4的整数倍,取数据元素就能更高效方便;
D.每个特定平台上编译器都有自己的默认的对齐系数(对齐模数),可通过编译命令来改变这一系数;
E.#pragma pack(n);//n=1,2,4,8,16,其中n就是你想要指定的系数。
一般情况下32位默认4字节对齐。

参考


1.下面的结构体大小分别是多大(假设32位机器)?
struct A {
char a; //1
char b; //1
char c; //1
};
//进行整体对齐,最大类型为1<对齐系数4,按1整体对齐,所以1+1+1=3 
struct B {
int a;  //4
char b; //1
short c;//2
};
//进行整体对齐,最大类型为4=对齐系数4,所以按4整体对齐4 1+2=3<4 对齐4 所以4+4=8 
struct C {
char b; //1
int a;  //4
short c;//2
};
//进行整体对齐,最大类型为4=对齐系数4,所以按4整体对齐 1<4(对齐4) 4=4 2<4(对齐4)  所以4+4+4=12 

二义性:语句可能会出现多重含义

如:用红墨水写一个“蓝”字,请问,这个字是红字还是蓝字?

#define POWER(x) ((x)*(x))   
目的就是得到x的平方,如果括号不完整如
#define POWER(x) (x)*(x)
POWER(x)/POWER(x)  ->(x)*(x)/(x)*(x)=x*x
又如
#define POWER(x) (x*x)
POWER(x+y)    -> (x+y*x+y)
运算符优先级
a+=a-=a+a;

1、a -= (a+a);
2、a += (第一个式子的结果);
从这可以看出,除了遵循运算符优先级,多个赋值运算符式子还遵循右向左计算顺序
在这里插入图片描述

main函数可以调用自己

函数调用本身叫做函数的递归。和普通的函数递归调用一样,只要设置 结束条件即可。

 void main() { cout<<1<<endl; main(); } 会一直输出1
  1. 一个空类对象的大小是1byte
预编译又称为预处理

是做些代码文本的替换工作。
处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等
就是为编译做的预备工作的阶段
主要处理#开始的预编译指令、

逗号表达式:

c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14;a=(a=35,a4)的值是60,其中(a=35,a4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。

setw(n)用法

通俗地讲就是预设宽度
如 cout<<setw(5)<<255<<endl;
结果是:
(空格)(空格)255

setfill(char c) 用法
就是在预设宽度中如果已存在没用完的宽度大小,则用设置的字符c填充

如 cout<<setfill(’@’)<<setw<<255<<endl;
结果是:
@@255

setbase(int n)

将数字转换为 n 进制.
如 cout<<setbase(8)<<setw(5)<<255<<endl;
cout<<setbase(10)<<setw(5)<<255<<endl;
cout<<setbase(16)<<255<<endl;
结果是:
(空格)(空格)377
(空格)(空格) 255
(空格)(空格) ff

fread(pt,size,n,fp)

指从fp指定的文件中读取长度为size的n个数据项,存入pt所指向的内存区

锁概念

独占锁(Exclusive Lock)
独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。
共享锁(Shared Lock)
共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。
更新锁(Update Lock)
更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。
死锁
就是线程A持有独占锁资源a,并尝试去获取独占锁资源b
同时,线程B持有独占锁资源b,并尝试去获取独占锁资源a
这样线程A和线程B相互持有对方需要的锁,从而发生相互等待,进程一直在等待的状态不会继续执行,最终变为死锁。在这里插入图片描述
15. 指针数组:数组元素是指针,实际是一个数组
数组指针:指向数组首地址的指针,实际是一个指针

  1. 对于编译器对二维数组声明的处理:编译器会忽略第一维信息而只注意第二维信息,因此在函数形参列表中可以是
int*it)[m]
或者
int D[][m]
指向常量的指针

口诀:左定值,右定向。

const double pi = 3.14; // pi是一个常量,不能改变它的值

const double *cptr = &pi; //cptr指向pi,注意这里的const不能丢,
//因为普通指针不能指向常量对象,即,不能用非const变量初始化指向常量的指针.

*cptr = 3.33;  //错误,试图改变所指对象的值。不能改变指针所指对象的值

cout << cptr << endl;//输出cptr的值

//虽然不能改变其所指对象的值,但是它可以指向别的常量对象
//这样的话 指针的值(也就是存放在指针中的那个地址)也会改变 比如:
cosnt double pi2 = 6.28;

cptr = &pi2; //正确  *cptr为6.28 

cout << cptr << endl; //cptr的值变了
const指针

表示指针本身是一个常量。由于指针是对象,因此就像其他对象一样,允许把指针本身定为常量。cosnt指针必须初始化,并且一旦初始化,const指针的值就不能改变了

int i = 42;

int * cosnt p = &i; //p是一个const指针

cosnt int i2 = 44;

p = &i2; //错误 不能改变p的值

//虽然不能给p赋值,也就是不能改变p的值,
//但是我们可以改变p所指的对象的内容。比如:

*p = 46; //正确 此时i为46
字符指针,且用字符串初始化

具有只读属性,所以不能直接赋值,编译可以通过,但是运行会出错。
那么char *b = “hello”, 不可以通过b[2]=l来更改字符串的某个字符,因为此时的字符串常量都是放在只读存储区的,都不可写。
如果若要修改其值,应该改为char str []= “hello”;可以通过指针来改。

数组名相当于数组第一个元素的地址

,如有数组int a[10]={0},那么a实际上就是一个地址,加上取地址符号&a,两者值是一样的,都是地址值。如若int *p=a,*p得到的值和a[0]是一样的同时p和a的值是一样的(都是数组第一个元素地址)
再者a等价于int *(指针)而&a等价于int **(指向指针的指针),实际上这个取地址,取的就是当前指针的地址而不是指针指向的地址,但是在当前情况下,a和&a就是在同一地址下的,所以上面说a和&a得到的结果是一样的。
那么a++,相当于指针自增1,递增到下一个元素的地址,&a++,相当于指向指针的指针自增1,且sizeof(a)是一个数组的大小,所以自增1就相当与增加了一个数组的长度,到达当前数组的下一个地址。
可看题型

纯虚函数

除了有virtual 关键字外,还令它等于0,以表为纯虚函数。拥有纯虚函数的类称为 抽象类。如若不加0则只为虚函数

指向类对象或结构体对象的指针

也可以使用“.”操作符来访问成员变量或函数,如(*p).a,等价于p->a

printf函数的输出格式说明:

%:表示格式说明的起始符号,也是转义符号,有一题 printf(“%%%%”)输出几个?答案输出%% 两个
-:有-表示左对齐输出,如省略表示右对齐输出
0:有0表示指定空位填0,如省略表示指定空位不填
m.n m指域宽,即对应的输出项在输出设备上所占的字符数。
n指精度。用于说明输出的实型数的小数位数。没有指定n时,隐含的精度为n=6位
e格式表示以指数形式输出实数
如题

指针偏移、两指针加减

:指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法、减法、比较等(没有乘除)。
指针加或减某一个整数n,当前指针的数据类型占用的字节数是m,那么指针偏移了n*m个字节
指针1减指针2,当前指针数据类型占用的字节数是m,那么结果是指针1地址减指针2的地址(转化为十进制),再除上m
参考链接http://c.biancheng.net/cpp/html/75.html
如题

字符类型的赋值
ch=62+3;//直接通过字符编码的十进制赋值

ch=NULL;//可以直接赋值空,相当于字符'\0'

ch='\xaa';//也可以领用十六进制赋值,可以直接加上''双引号

其中注意的是,并没有 ′ / ′ '/' /这个字符,如若需要赋值字符 / 那么应该是 ′ / / ′ '//' //这样

重载运算符:
     (1)只能使用成员函数重载的运算符有:=、()、[]、->、new、delete。
      (2)单目运算符最好重载为成员函数。
      (3) 对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建议重载为成员函数。
      (4) 对于其它运算符,建议重载为友元函数。
友元函数:
  • 友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。
  • 通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。c++中的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。
  • 友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend
  • 友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
    一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
    友元函数的调用与一般函数的调用方式和原理一致。
友元类:
  • 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
    当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类
类成员函数的重载、覆盖和隐藏
  • 成员函数被重载的特征:
    (1)相同的范围(在同一个类中)
    (2)函数名字相同;
    (3)参数不同;
    (4)virtual 关键字可有可无。
  • 覆盖是指派生类函数覆盖基类函数,特征是:(此种情况必须是虚函数)
    (1)不同的范围(分别位于派生类与基类);
    (2)函数名字相同;
    (3)参数相同;
    (4)基类函数必须有virtual 关键字。
  • “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
    (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏,此种情况有可能是虚函数(注意别与重载混淆)。
    (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
  • 其中虚函数如果派生类和基类是同名同参就是覆盖,同名不同参就是隐藏
    例子
class Base
{
public:
    virtual	void f(float x){ cout << "Base::f(float) " << x << endl; }
    void g(float x){ cout << "Base::g(float) " << x << endl; }
    void h(float x){ cout << "Base::h(float) " << x << endl; }
};
class Derived : public Base
{
public:
    virtual	void f(float x){ cout << "Derived::f(float) " << x << endl; }
    void g(int x)  { cout << "Derived::g(int) " << x << endl; }
    void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
Derived::f(float x)函数覆盖了基类Base::f(float x)函数。子父类同名同参,
父类有virtual关键字
Derived::g(int x)  函数隐藏了基类Base::g(float x)函数。同名不同参,
无论有无virtual修饰
Derived::f(float x)函数隐藏了基类Base::f(float x)函数。同名同参,
且基类无virtulal修饰

覆盖的情况是整个类的继承派生中不会有该函数的函数操作,也就是说不管是基类还是派生类调用该成员函数都只调用最终用于覆盖的函数。隐藏只能说是在各自类中调用的话还是只会调用属于该类的成员函数
链接有程序例子说明该区别https://blog.csdn.net/minghui_/article/details/65441503

头文件调用<> 和" "

<>表示直接从库中查找,找不到再当前目录找,“”表示在当前目录中找,找不到再在库中查找,一般自己写的头文件用#include “”,而使用库函数用#include <>

类的初始化问题

A:静态函数属于类本身,不与类绑定,因此不能用this指针。
B:在类定义时,无法使用构造函数,因而无法完成对象的初始化
C:一般成员变量需要在类内进行初始化
D:静态成员变量必须在类外初始化,静态成员常量在类中初始化。

fwrite()

向文件写任何东西; fputs() 向文件写入字符串
30. 位运算就是直接对整数在内存中的二进制位进行操作,而浮点数是无法精确的转化为二进制表示的,所以是无法进行位运算的
31. 注意C++中的空是大写的NULL,而java的是小写null

sizeof的使用

https://www.cnblogs.com/huolong-blog/p/7587711.html

char *b = "helloworld";  
char *c[10];  
double *d;  
int **e;  
void (*pf)();    
  
cout<<"char *b= "helloworld" "<<sizeof(b)<<endl;//指针指向字符串,值为4  
cout<<"char *b        "<<sizeof(*b)<<endl; //指针指向字符,值为1  
cout<<"double *d      "<<sizeof(d)<<endl;//指针,值为4  
cout<<"double *d      "<<sizeof(*d)<<endl;//指针指向浮点数,值为8  
cout<<"int **e        "<<sizeof(e)<<endl;//指针指向指针,值为4  
cout<<"char *c[10]    "<<sizeof(c)<<endl;//指针数组,值为40  
cout<<"void (*pf)();  "<<sizeof(pf)<<endl;//函数指针,值为4
strlen的使用
char sArr[] = "ILOVEC";
/*用strlen()求长度*/
printf("sArr的长度=%d\n", strlen(sArr));

很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)。

char sArr[] = "ILOVEC";
/*用sizeof求长度*/
printf("sArr的长度=%d\n", sizeof(sArr));

相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)

Linux

  1. du(disk usage) 命令功能说明:统计目录(或文件)所占磁盘空间的大小
    df(disk file) 命令功能说明: 用于显示文件系统的磁盘使用情况
    free 命令功能说明: 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区
    vmstat 命令功能说明: 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息

  2. /var/log/lastlog: 记录系统中所有用户最后一次的登录时间的曰志。这个文件也是二进制文件.不能直接用Vi 查看。而要使用lastlog命令查看
    /var/log/wtmp:永久记录所有用户的登陆、注销信息,同时记录系统的后动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看.
    /var/log/utmp: 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用Vi查看,而要使用w、who、users等命令查看

  3. 用户使用计算机的方式
    1.命令接口:分为联机命令接口和脱机命令接口
    2.程序接口:其实就是系统调用
    3.GUI接口:也就是图形接口

  4. 硬链接(hard link, 也称链接) 就是一个文件的一个或多个文件名。
    使用目的:多个文件名能同时修改同一个文件。
    一个文件有几个文件名,我们就说该文件的链接数为几。链接数可以是1, 这表明该文件只有一个文件名。
    链接操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称。对于这个新的文件名,我们可以为之指定不同的 访问权限 ,以控制对信息的共享和安全性的问题。 如果链接指向目录,用户就可以利用该链接直接进入被链接的目录而不用打一大堆的路径名。而且,即使我们删除这个链接,也不会破坏原来的目录。
    硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
    软连接
    另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
    在这里插入图片描述
    参考链接https://zhuanlan.zhihu.com/p/67366919

  5. 使用chomd命令改变文件权限。
    Linux文件基本权限有9个,owner,group,others三种身份对应各自read,write,execute(执行)三种权限。
    文件权限字符:“-rwx rwx rwx”三个一组。数字化r:4 w:2 x:1
    在这里插入图片描述
    其中命令 chmod 666 filename 表示改权限,三种用户都有读写执行的权限
    加个加号(+) 就表明是增加权限
    chomd +500 filename 表示给user增加权限为读写,但是文件所属群和其他用户权限不变
    chmod +x filename 表示user增加执行权限
    注意: r:对目录来说,具有浏览目录的权限。x:对目录了来说该用户具有进入目录的权限。要浏览(r)就必须赋予进入(x)的权限。只有这样,文件才可以cd进去

  6. DNS服务器主配置文件: /etc/named.conf

  7. 原语通常由若干条指令组成,用来实现某个特定的操作。通过一段不可分割的或不可中断的程序实现其功能。原语是操作系统的核心,它不是由进程而是由一组程序模块所组成,是操作系统的一个组成部分

  8. 系统中的资源可以分为两类,一类是可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺。例如,优先权高的进程可以剥夺优先权低的进程的 处理机 。又如,内存区可由 存储器管理 程序,把一个进程从一个存储区移到另一个存储区,此即剥夺了该进程原来占有的存储区,甚至可将一进程从内存调到外存上,可见, CPU 和 主存 均属于可剥夺性资源。另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如 磁带机 、打印机等。

  9. 线程和进程:

  • 首先先理解线程和进程的概念,参考链接https://zhuanlan.zhihu.com/p/73440901

  • 进程:进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:创建状态,运行状态,等待状态(阻塞状态),就绪状态,终止状态。

  • 线程: 线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

  • 联系: 线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程,多个线程共享同一个进程中的资源。

  • 线程和进程区别:

  • 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

  • 在开销方面:由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销

  • 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

  • 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

  • 包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

  • 在并发性方面,在引入线程的操作系统中,不仅进程之间可以并发执行,而且同一进程内的多线程之间也可并发执行,从而使操作系统具有更好的并发性,大大提高系统的吞吐量。

  • 进程和程序的区别

  • 程序是静态概念,本身可以作为一种软件资源保存;而进程是程序的一次执行过程,是动态概念,它有一定的生命期,是动态地产生和消亡的。

  • 进程是一个能独立运行的单位,能与其他进程并发执行,进程是作为资源申请和调度单位存在的;而通常的程序段不能作为一个独立运行的单位。

  • 程序和进程无一一对应关系。一方面一个程序可由多个进程共用;另一方面,一个进程在活动中又可顺序地执行若干个程序。

  • 进程状态 参考链接https://blog.csdn.net/hguisu/article/details/1910803
    在这里插入图片描述

CPU多进程程并发调度
在这里插入图片描述

  • 任务调度
    在这里插入图片描述
  1. 单道程序系统:是单个程序进入计算机系统,对磁带上的一批作业能自动的逐个作业,依次运行,无须人工干预;并对磁带上的各道作业有顺序地进入内存,各道作业完成的顺序与它们进入内存的顺序在正常情况下是完全相同的。就是像队列一样,按顺序执行。
  2. 多道程序系统:指的是允许多个程序同时进入一个计算机系统的主存储器并启动进行计算的方法。是一个并行的思想,多个程序交替执行。引入多道程序设计技术的根本目的是为了提高CPU的利用率,充分发挥计算机系统部件的并行性,现代计算机系统都采用了多道程序设计技术。
  3. 文件存取方式分为:
    顺序存取方法:从开始处顺序读起,不能跳过某些内容;
    随机存取方法:把文件视为带有编号的块或记录,每块的大小通常是一样的,并将其视为操作系统的最小的定位单位,随机存取是根据需要任意存取文件中的任何块或记录;
  4. ls>c 其中ls是显示当前目录下的文件名称,而这命令就是把当前目录下的所有文件夹名称都放入文件夹c中,包括文件夹c。如果文件夹c还未存在,就会先创建文件夹c

数据结构

  1. 折半查找
    二分查找:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半
    其最多查找的次数是 l o g 2 N log_2N log2N次,也就是N能被除以2多少次
  2. 有一段楼梯台阶有15级台阶,以小明的脚力一步最多只能跨3级,请问小明登上这段楼梯有多少种不同的走法?
    假设在第0阶台阶上时,一级台阶时只有一种方法,两级台阶有两种,三级台阶有4种方法,四级台阶有7种,。。。,显然这是斐波那契数列f(n)=f(n-1)+f(n-2)+f(n-3)
  3. 顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top只是栈顶元素在顺序栈中的位置。这里以top=-1表示空栈。
    表示顺序栈的数组下标如果从0开始,栈空的条件是top==-1,栈满的条件是top == maxsize-1;
    如果从1开始,top == 1表示栈空,top == maxsize表示栈满;
    链式栈可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。
  4. 算法有5个特性:1、准确性。2、有零个或者多个输入3、有至少一个或多个输出4、有穷性。5、可行性。
  5. 二叉链表存储树:在标准库中提供的是孩子兄弟表示方法,一个链表节点左指针是指向其子节点,右节点指向兄弟节点,那么根节点是没有兄弟节点的,所以其有指针域为空
    在这里插入图片描述
    如树
    在这里插入图片描述其链表树
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值