栈的表示和实现的最后阶段,也学习了链表
算法三
顺序栈的出栈
先将top指针从栈顶的上一个元素移到栈顶,然后值拿出来
先对栈S进行操作,将栈顶指针下移,在获取栈顶元素e
链栈的表示和实现
链栈是运算受限的单链表,只能在链表头部进行操作
链表的学习
数组下标可以快速定位一个元素,储存空间连续
链表的储存空间非连续,且每一个结点储存两个域,一个数据,一个next指针
指向下一个结点的首地址,最后的next指针指向NULL空
删除一个结点如下图所示
插入一个结点如下图
所以任何一个结点的插入删除只需要修改指针的指向,这点比数组好
链表的分类
单项链表
循环链表
双向链表
两个指针域
单向循环链表
双向循环链表
拿到链表的第一个结点,就相当于拿到整个链表
头节点不保存任何数据,且头节点永远是第一个结点
就不用考虑插入是否是插入在头的位置
今日题目练习
题目背景
悬挂在屋檐下的风铃,摇晃的声音很动听。
思念就像梅雨下不停,我的心境一片泥泞。
散落在天际里的繁星,闪烁着你我的宿命。
当枫叶轻盈落入湖心,近看山水一片宁静。
——银临 & 涵昱《苦竹林》
题目描述
共有 �n 个风铃悬挂在屋檐下,每个风铃都能发出一定音调的声音。从左到右给风铃从 11 至 �n 编号,第 �i 个风铃的音调是 ��ai。
为了表达内心的思念,扶苏决定在 �n 个的风铃中取出 �m 个,送给远方的朋友。
请你找到最小的整数 �ε,使得存在一种方案,能够从 �n 个风铃中挑出 �m 个,设挑出风铃的音调为 �1,�2,…��b1,b2,…bm,满足对任意的 1≤�,�≤�1≤i,j≤m,都有 ∣��−��∣≤�∣bi−bj∣≤ε。
输入格式
第一行是两个整数,表示风铃的个数 �n 和挑选出风铃的个数 �m。
第二行有 �n 个整数,表示每个风铃的音调。第 �i 个整数表示 ��ai。
输出格式
输出一行一个整数,表示最小的 �ε。
输入输出样例
输入 #1复制
5 3 1 2 3 4 5
输出 #1复制
2
输入 #2复制
6 4 1 7 8 3 4 6
输出 #2复制
4
说明/提示
样例 2 解释
一种选择的方案是选择第 2,4,5,62,4,5,6 四个风铃,音调依次为 7,3,4,67,3,4,6。可以得到对任何的 1≤�,�≤41≤i,j≤4,都有 ∣��−��∣≤4∣bi−bj∣≤4。
另一种方案是选择第 2,3,5,62,3,5,6 四个风铃,同样计算得到的 �ε 为 44。
数据规模与约定
- 对 10%10% 的数据,�=2m=2。
- 另有 10%10% 的数据,�=�m=n。
- 对 40%40% 的数据,�≤5n≤5。
- 对 60%60% 的数据,保证对所有的 2≤�≤�2≤i≤n,满足 ��−1≤��ai−1≤ai,即 ��ai 单调不降。
- 对 80%80% 的数据,�≤103n≤103。
- 对 100%100% 的数据,2≤�≤�≤1052≤m≤n≤105,1≤��≤1091≤ai≤109。
#include<stdio.h>
int main()
{
int n = 0, m = 0;
int a[100001];
scanf("%d%d", &n, &m);
int num = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n-1-i; j++)
{
if (a[j] > a[j + 1])
{
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
if (n % 2 != 0)
{
int mid = (n - 1) / 2;
if (m % 2 != 0)
{
int t = (m - 1) / 2;
num = a[mid + t] - a[mid - t];
printf("%d", num);
}
else
{
int t = m / 2;
int num1 = 0, num2 = 0;
num1 = a[mid + t] - a[mid + 1 - t];
num2 = a[mid - 1 + t] - a[mid - t];
if (num1 > num2)
num = num1;
else
num = num2;
printf("%d", num);
}
}
else if (n % 2 == 0)
{
int mid1 = n / 2 - 1;
int mid2 = n / 2;
if (m % 2 == 0)
{
int t = (m - 2) / 2;
num = a[mid2 + t] - a[mid1 - t];
printf("%d", num);
}
else
{
int t = (m - 2 + 1) / 2;
int num1 = a[mid2 - 1 + t] - a[mid1 - t];
int num2 = a[mid2 + t] - a[mid1 + 1 - t];
if (num1 > num2)
num = num1;
else
num = num2;
printf("%d", num);
}
}
return 0;
}