数据结构面试汇总
stack
堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构
操作 比较和分配堆栈
栈的应用——括号匹配问题
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
#include <iostream>
#include <stack>
using namespace std;
int main ()
{
stack<int> mystack;
for (int i=0; i<5; ++i) mystack.push(i);
cout << "Popping out elements...";
while (!mystack.empty())
{
cout << " " << mystack.top();
mystack.pop();
}
cout << endl;
return 0;
}
Queue
队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
进行插入的一端称为队尾(rear),插入动作称为进队或入队
进行删除的一端称为队头(front),删除动作称为出队
队列的性质:先进先出(First-in, First-out)
双向队列:队列的两端都允许进行进队和出队操作
queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()
#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int e,n,m;
queue<int> q1;
for(int i=0;i<10;i++)
q1.push(i);
if(!q1.empty())
cout<<"dui lie bu kong\n";
n=q1.size();
cout<<n<<endl;
m=q1.back();
cout<<m<<endl;
for(int j=0;j<n;j++)
{
e=q1.front();
cout<<e<<" ";
q1.pop();
}
cout<<endl;
if(q1.empty())
cout<<"dui lie bu kong\n";
system("PAUSE");
return 0;
}
List
Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢
assign()
给list赋值
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回list的配置器
insert() 插入一个元素到list中
max_size() 返回list能容纳的最大元素数量
merge() 合并两个list
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
rbegin() 返回指向第一个元素的逆向迭代器
remove() 从list删除元素
remove_if() 按指定条件删除元素
rend() 指向list末尾的逆向迭代器
resize() 改变list的大小
reverse() 把list的元素倒转
size() 返回list中的元素个数
sort() 给list排序
splice() 合并两个list
swap() 交换两个list
unique() 删除list中重复的元素
实例:
[cpp] view plaincopy
- #include <iostream>
- #include <list>
- #include <numeric>
- #include <algorithm>
- using namespace std;
- //创建一个list容器的实例LISTINT
- typedef list<int> LISTINT;
- //创建一个list容器的实例LISTCHAR
- typedef list<int> LISTCHAR;
- void main()
- {
- //用list容器处理整型数据
- //用LISTINT创建一个名为listOne的list对象
- LISTINT listOne;
- //声明i为迭代器
- LISTINT::iterator i;
- //从前面向listOne容器中添加数据
- listOne.push_front (2);
- listOne.push_front (1);
- //从后面向listOne容器中添加数据
- listOne.push_back (3);
- listOne.push_back (4);
- //从前向后显示listOne中的数据
- cout<<"listOne.begin()--- listOne.end():"<<endl;
- for (i = listOne.begin(); i != listOne.end(); ++i)
- cout << *i << " ";
- cout << endl;
- //从后向后显示listOne中的数据
- LISTINT::reverse_iterator ir;
- cout<<"listOne.rbegin()---listOne.rend():"<<endl;
- for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) {
- cout << *ir << " ";
- }
- cout << endl;
- //使用STL的accumulate(累加)算法
- int result = accumulate(listOne.begin(), listOne.end(),0);
- cout<<"Sum="<<result<<endl;
- cout<<"------------------"<<endl;
- //--------------------------
- //用list容器处理字符型数据
- //--------------------------
- //用LISTCHAR创建一个名为listOne的list对象
- LISTCHAR listTwo;
- //声明i为迭代器
- LISTCHAR::iterator j;
- //从前面向listTwo容器中添加数据
- listTwo.push_front ('A');
- listTwo.push_front ('B');
- //从后面向listTwo容器中添加数据
- listTwo.push_back ('x');
- listTwo.push_back ('y');
- //从前向后显示listTwo中的数据
- cout<<"listTwo.begin()---listTwo.end():"<<endl;
- for (j = listTwo.begin(); j != listTwo.end(); ++j)
- cout << char(*j) << " ";
- cout << endl;
- //使用STL的max_element算法求listTwo中的最大元素并显示
- j=max_element(listTwo.begin(),listTwo.end());
- cout << "The maximum element in listTwo is: "<<char(*j)<<endl;
- }
单链表的基本操作
https://www.cnblogs.com/leaver/p/6718421.html
排序
冒泡
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { // 相邻元素两两对比
var temp = arr[j+1]; // 元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
快排
void Qsort(int a[], int low, int high)
{
if(low >= high)
{
return;
}
int first = low;
int last = high;
int key = a[first];/*用字表的第一个记录作为枢轴*/
while(first < last)
{
while(first < last && a[last] >= key)
{
--last;
}
a[first] = a[last];/*将比第一个小的移到低端*/
while(first < last && a[first] <= key)
{
++first;
}
a[last] = a[first];
/*将比第一个大的移到高端*/
}
a[first] = key;/*枢轴记录到位*/
Qsort(a, low, first-1);
Qsort(a, first+1, high);
}
冒泡
它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
选择
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
插入
构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
希尔
优先比较距离较远的元素
归并
将已有序的子序列合并,得到完全有序的序列
快排
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小
堆
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。