- 《大话数据结构》读书笔记+课程补充
- 每日一个例题示范
一、读书笔记+课程补充
顺序存储 顺序查找:
最好情况——1次
最坏情况——n
平均时间复杂度——O(n)
再该情况下 算法的基本操作重复执行次数随问题的输入数据集有所不同
考虑最坏时间复杂度(一般考虑) 平均时间复杂度 最好时间复杂度
渐进空间复杂度:S(n)=O(f(n))
n为问题的规模或大小
分析例题:
将一维数组a中的n个数逆序放到原数组中:
for(i=0;i<n/2;i++){
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
线性表的定义与特征:具有相同特性的数据元素的一个有序数列
知识回顾——
使用线性表描述多项式非零项:
稀疏多项式的运算:
首先创建一个新数组c
分别从头遍历比较a和b的每一项
指数相同的 系数相加 和不为零 则在c中增加一个新项
指数不相同 将指数较小的项复制到c中(保留小的)
一个多项式遍历完成后 再将另一个剩余依次复制到c中即可
链式存储结构 链表:
依次指向 遍历 保留 在链表上实现操作 不需要额外的空间
二、每日一个例题示范
题目描述
M 海运公司最近要对旗下仓库的货物进出情况进行统计。目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志。该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量;第二类操作为集装箱的出库操作。这些记录都严格按时间顺序排列。集装箱入库和出库的规则为先进后出,即每次出库操作出库的集装箱为当前在仓库里所有集装箱中最晚入库的集装箱。
出于分析目的,分析人员在日志中随机插入了若干第三类操作――查询操作。分析日志时,每遇到一次查询操作,都要报告出当前仓库中最大集装箱的重量。
输入格式
包含 �+1N+1 行:
第一行为一个正整数 �N,对应于日志内所含操作的总数。
接下来的 �N 行,分别属于以下三种格式之一:
- 格式 1:
0 X
,表示一次集装箱入库操作,正整数 �X 表示该次入库的集装箱的重量。 - 格式 2:
1
,表示一次集装箱出库操作,(就当时而言)最后入库的集装箱出库。 - 格式 3:
2
,表示一次查询操作,要求分析程序输出当前仓库内最大集装箱的重量。
当仓库为空时你应该忽略出库操作,当仓库为空查询时你应该输出 00。
输出格式
输出行数等于日志中查询操作的次数。每行为一个整数,表示查询结果。
源代码:
#include <stdio.h>
#include <stdlib.h>
// 定义集装箱结构体
typedef struct {
int weight;
int is_in_warehouse; // 1表示在仓库中,0表示已出库
} Container;
int main() {
int N;
scanf("%d", &N);
Container *warehouse = (Container *)malloc(N * sizeof(Container));
int top = -1; // 栈顶指针,指向仓库中最后入库的集装箱
for (int i = 0; i < N; ++i) {
int operation;
scanf("%d", &operation);
if (operation == 0) {
// 入库操作
int weight;
scanf("%d", &weight);
// 将集装箱入栈
top++;
warehouse[top].weight = weight;
warehouse[top].is_in_warehouse = 1;
} else if (operation == 1) {
// 出库操作
if (top >= 0) {
// 将最后入库的集装箱出栈
top--;
}
} else if (operation == 2) {
// 查询操作
if (top >= 0) {
// 输出当前仓库中最大集装箱的重量
int max_weight = warehouse[top].weight;
printf("%d\n", max_weight);
} else {
// 仓库为空,输出0
printf("0\n");
}
}
}
// 释放动态分配的内存
free(warehouse);
return 0;
}