表
1、线性表的实现方式:
顺序实现:用一组地址连续的存储单元依次存储线性表的数据元素。(需要预先分配表的大小,适用于随机存取元素,按位置访问时间复杂度为O(1) )
链表实现:用一组任意的存储单元存储线性表的数据元素。(需要存储额外的信息以实现表的逻辑关系,适用于随机插入或删除元素)
2、链表:单链表、双向链表、循环链表
队列
3、循环队列判断是否已满:
bool isFull = ((rear+1)%MaxSize == front) ? 1 : 0;
栈
4、括号匹配问题
输入:给定一个字符串,里边可能包含“()”、“[]”、“{}”三种括号,请编写程序检查该字符串中的括号是否成对出现,且嵌套关系正确。
输出:
true:若括号成对出现且嵌套关系正确,或该字符串中无括号字符;
false:若未正确使用括号字符。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
bool Judge(string str) { //使用栈判断括号匹配
stack<char> s;
for(int i = 0; i < str.length(); i++) {
switch (str[i]) {
case '(': //遇到左括号,将左括号入栈
s.push('(');
break;
case '[':
s.push('[');
break;
case '{':
s.push('{');
break;
case ')': //遇到右括号,判断栈顶是否是匹配的左括号,若是,出栈,若不是,返回false
if (s.top() == '(') {
s.pop();
}
else {
return false;
}
break;
case ']':
if (s.top() == '[') {
s.pop();
}
else {
return false;
}
break;
case '}':
if (s.top() == '{') {
s.pop();
}
else {
return false;
}
break;
}
}
if (s.empty()) {
return true; //当所有的元素出栈后,s为空说明是匹配的
}
else {
return false;
}
}
int main() {
string str;
while (cin >> str) {
cout << Judge(str) << endl;
}
return 0;
}
树
5、树的遍历:深度优先遍历、广度优先遍历
6、二叉树:
a.包含n个结点的二叉树边数为n-1
b.若二叉树的高度为h,则最少有h个元素,最多有2^h-1个元素
c.包含n个元素的二叉树的高度最大为n,最小为log2(n+1)
d.若完全二叉树(对应满二叉树)右n个结点,其中一元素的序号为i,则当i=1时,该元素为二叉树的根;当2i>n时,该元素无左孩子,否则,其左孩子编号为2i;当2i+1>n时,该元素无右孩子,否则,其右孩子编号为2i+1。(注意i从1开始)
7、二叉树的遍历(递归)
a.前序遍历
template<class T>
void PreOrder(BinaryTreeNode<T> t){
if(t){
visit(t);
PreOrder(t->LeftChild);
PreOrder(t->RightChild);
}
}
b.中序遍历
template<class T>
void PreOrder(BinaryTreeNode<T> t){
if(t){
PreOrder(t->LeftChild);
visit(t);
PreOrder(t->RightChild);
}
}
c.后序遍历
template<class T>
void PreOrder(BinaryTreeNode<T> t){
if(t){
PreOrder(t->LeftChild);
PreOrder(t->RightChild);
visit(t);
}
}
8、二叉树的高度 = Max(左子树高度,右子树高度)+1
int height(Node *root)
{
if( root == NULL ) return 0; //注意递归的出口,不写就死递归了
int l = height( root->left );
int r = height( root->right );
return l > r ? l+1 : r+1;
}
9、图的实现方式:
邻接矩阵
邻接表
10、图的搜索方式:广度优先搜索和深度优先搜索