一、断点调试
断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。进行分析从而找到这个Bug。
断点调试是程序员必须掌握的技能。
断点调试也能帮助我们查看底层源代码的执行过程,提高程序员的编程水平。
二、数据结构
定义
数据结构是由数据和结构两方面组成。简单来说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科,学好数据结构可以使计算机更高效地工作。
常用的数据结构有:
数组、栈、队列、链表、双向链表、散列表、二分搜索树
三、线性表
类别
根据存储方式不同,线性表可以分为顺序表和链表。
定义
线性表是线性结构中最常用而又最简单的一种数据结构,线性表是线性结构的抽象,线性结构的特点是一对一的线性关系。
四、栈和队列
栈
栈类似于洗盘子,使用栈存储数据,讲究“先进先出”,即最先进栈,最后出栈。栈是只能在表尾进行插入或删除操作的线性表,通常我们称表尾为栈顶,表头为栈底,表尾插入称为入栈,表尾删除称为出栈。
例题P1449后缀表达式
#include<iostream>
#include<string>
#include<stack>
using namespace std;
string str;
int i, a, b, ans, anss;
stack<int>sta;
int main()
{
cin >> str;
for (int i = 0; i < str.length(); i++)//每个字符循环一遍
{
if (str[i] == '@')//最高优先级
{
break;
}
else if (str[i] <= '9' && str[i] >= '0')
{
a = str[i] + 10 * b-'0';//a是int类型,但str[i]是字符,此时的a自动等于该字符的ascll码表,只有减去0这个字符的ascll码值才能等于这个数字
b = a;
}
else if (str[i] == '.')
{
sta.push(a);
a = 0;
b = 0;
}
else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
{
if (str[i] == '+')
{
ans = sta.top();
sta.pop();
anss = sta.top();
sta.pop();
sta.push(anss + ans );
}
if (str[i] == '-')
{
ans = sta.top();
sta.pop();
anss = sta.top();
sta.pop();
sta.push( anss- ans);
}
if (str[i] == '*')
{
ans = sta.top();
sta.pop();
anss = sta.top();
sta.pop();
sta.push(anss * ans );
}
if (str[i] == '/')
{
ans = sta.top();
sta.pop();
anss = sta.top();
sta.pop();
sta.push(anss / ans );
}
}
}
cout << sta.top();
return 0;
}
队列
队列顾名思义,使用队列存储数据,保证“先进先出”,队列插入操作称为入队,队列删除操作称为出队,允许插入的一端称为队尾,允许删除的一端称为队头,不含任何数据元素的队列叫空队。
例题P1996约瑟夫问题
#include<iostream>
#include<queue>
using namespace std;
int n,m,a=1;
queue<int>q;//创建队列q
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
q.push(i);//将1到n添加到队列q中
}
while (!q.empty())//判断q是否为空,空则返回ture,结束模拟
{
if (a == m)//如果报的数和m相同
{
cout << q.front() << " ";//先输出头
q.pop();//头出队
a = 1;//再从1开始报数
}
else
{
q.push(q.front());//将头压进队尾
q.pop();//删除头
a++;
}
}
return 0;
}
五、串和数组
串
在C语言中,字符串存于字符型数组中。无论数组有多大,用数值0表示串结束。
数组
数组是计算机编程世界里最常见的数据结构。任何一种编程语言都包含数组,只是形式上略有不同罢了。数组是编程语言中的内建类型,通常效率很高,可以满足不同需求的数据存储。
例题P3156询问学号
#include<iostream>
using namespace std;
int n,m,a[10000000],b[1000000],x;
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <=m; i++)
{
cin >> b[i];
}
for (int i = 1; i <= m; i++)
{
cout << a[b[i]] << "\n";
}
return 0;
}
可变数组vector(向量)
在 C++ 的STL(标准数据库Standard Template Library)中,给我们提供了一个可变长度数组。
可变长度数组的头文件是 #include< vector >
六、树
定义
树型结构是一种非常重要的非线性数据结构,它可以用来描述数据元素之间的层次关系。
基本术语
结点:使用树结构存储的每⼀个数据元素都被称为“结点”。
根结点:有⼀个特殊的结点,这个结点没有前驱,我们将这种结点称之为根结点。
叶子结点:如果⼀个结点没有任何子结点,那么此结点就称之为叶子结点。
结点的度:结点拥有的子树的个数,就称之为结点的度。
树的度:在各个结点当中,度的最大值。为树的度。
树的深度或者⾼度:结点的层次从根结点开始定义起,根为第⼀层,根的孩⼦为第⼆层。依次类推。