数据结构:1.线性; 2.非线性。
程序设计=算法+数据结构!!!
数组:
数组的特性:
占用连续的内存空间 a[3]和a[4]
定位 取第i个元素 O(1)
查找某个元素 是否有 ? O(n) for 循环 或 二分 O(log2(n))
插入一个元素 如果要在第i个元素后插入 从右往左从第n个到第i+1个元素依次往右移动 O(n)
删除一个元素 第i个元素 从第i+1个元素到第n个元素依次往左移动
链表:
什么时候用链表???
当要在一串数组中插入或删除时,会十分麻烦,就可以用链表来代替数组,使空间复杂度变成o(1)。
("_")
不连续的内存空间 next prev
和数组对应 链表的插入和删除操作都是 O(1)
数组的特性:
占用连续的内存空间 a[3]和a[4]
定位 取第i个元素 O(1)
查找某个元素 是否有 ? O(n) for 循环 或 二分 O(log2(n))
插入一个元素 如果要在第i个元素后插入 从右往左 从第n个到第i+1个元素依次往右移动 O(n)
删除一个元素 第i个元素 从第i+1个元素到第n个元素依次往左移动
插入
元素d的下标 是p
a[s].next=a[p].next; a[p].next=s;
栈(stack):
后进先出
括号匹配 : 左括号 进栈 ,右括号 和栈顶 匹配
加强版: 开一个bool数组 F,用括号匹配的方式来让F[i] 是否匹配
在F数组里 找到 最长的连续为真的子序列长度
For (int i=1;i<=n;i++)
For(int j=I;j<=n;j++)
{
Sum=0;
For(int k=I;k<=j;k++) sum+=a[k];
If(sum>maxx) maxx=sum;
}
Int sum[N];
For (int i=1;i<=n;i++)
{
Cin>>a[i]; sum[i]=sum[i-1]+a[i];
}
For (int i=1;i<=n;i++)
For(int j=I;j<=n;j++)
{
If(sum[j]-sum[i-1]>maxx) maxx=sum;
}
Sum=0;
For (int i=1;i<=n;i++)
{
Sum=sum+a[i];
If(sum>maxx) maxx=sum;
If(sum<0) sum=0;
}
队列: 队头 head队尾 tail
Int q[N] head=0;tail=0;
q[++tail]=V
int temp=q[head++];
while (head<=tail)