1.栈
1、栈是一个先入后出的有序结构。
2、栈是限制性表中元素的插入和删除只能在线性表的表尾进行的一种特殊线性表。
3、允许插入和删除的一段称为变化端,叫栈顶(Top),另一端叫栈底(Bottom),在栈的最低端。
4、压入元素在栈的最下端,称为压栈(Push),弹出元素从栈顶开始,称为弹栈(Pop)。
入栈:
出栈:
线性表:仅在表尾进行插入或者删除的线性表。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm >、<deque >、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。其中的<stack>就是栈。
stack<int> s;
for(int i=0;i<10;i++){
s.push(i);
cout<<s.size()<<endl;
}
while (!s.empty()){
s.pop();
}
2.计数排序
![](https://i-blog.csdnimg.cn/blog_migrate/c1e1a825fe76a7c23b257a07e1245392.png)
3.桶排
![](https://i-blog.csdnimg.cn/blog_migrate/53598256bc2e6191236e84075db59284.png)
实例+代码
public static void radixSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
radixSort(arr, 0, arr.length - 1, maxbits(arr));
}
// 需要被排序的数组:arr[begin .. end]
// 最大的数有几个十进制位:digit 10:2;100:3;1000:4
// 辅助空间:bucket:有多少个数 就准备多少个辅助空间
// 固定的个数:10 radix: 0~9
// for循环:根据十进制位
//
//1.取个位数做词频统计
//2.count->count' 《=0的有几个
//3.对于arr从右往左遍历数组 看个位数
//4.把数字考回原数组
public static void radixSort(int[] arr, int begin, int end, int digit) {
final int radix = 10;
int i = 0, j = 0;
int[] bucket = new int[end - begin + 1];
for (int d = 1; d <= digit; d++)
{
int[] count = new int[radix]; // 固定的数组 count[0..9]
//1.取个位数出来做词频统计
for (i = begin; i <= end; i++)
{
j = getDigit(arr[i], d); //取个位数
count[j]++;
}
//2.count->count'
for (i = 1; i < radix; i++) {
count[i] = count[i] + count[i - 1];
}
//3.从右往左遍历数组
for (i = end; i >= begin; i--) {
j = getDigit(arr[i], d);
bucket[count[j] - 1] = arr[i];
count[j]--;
}
for (i = begin, j = 0; i <= end; i++, j++) {
arr[i] = bucket[j];
}
}
}
//int x:被取数值
//int d:取的位数
//返回值:十进制数的特定位
public static int getDigit(int x, int d) {
return ((x / ((int) Math.pow(10, d - 1))) % 10);
}
1.词频统计的结果:count[]
2.count-count'结果 count'[]
3. 个位数从右往左遍历后的结果 :bucket[]