近期学习知识总结

栈与队列

  • 栈的知识点——特殊的线性表

 1.栈的逻辑结构

限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底。但是,栈只是对表插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。

  1. 栈的操作特性:后进先出
  2. 栈的操作:与单链表相似,限定了插入与删除的位置。
  3. STL的栈 <stack>  pop()删除栈顶;push();栈顶添加 size(); 长度

 

二.

队列——也是特殊的单链表

  1. 队列的逻辑结构

只允许在一端进行插入操作,而另一端进行删除操作的线性表,允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队头。

  1. 队列的操作特性:先进先出
  2. STL的队列<queue> front();队首。pop();删除。push()添加。Size();长度。back();队尾。

例:火车进站问题

处理时可以采用至少两个的中间队列,先将第一节火车放到第一个栈里面,如果是1号车就可以直接出栈,如果不是在比较下一个车号,如果比第一栈的小就放到第二个栈里面,大的话就放到第一个站里面,以此循环直到找到一号车让他入站,比较两个栈里面的车号,以及剩下的有没有2号,没有继续入栈,找到就入站,全部的车全部入栈后,这两个栈里面的车号一定是从小大的,比较栈顶与站尾的车号,进站就可以解决。

 

 

 

 

数组与字符串

一.模式匹配

给定主串S="s1s2…sn"和模式T="t1t2…tm",在S中寻找T 的过程称为模式匹配。

  1. BF(Brute-Force)算法
    1. 在串S和串T中设比较的起始下标i和j;
    2. 循环直到S或T的所有字符均比较完;
      •  如果S[i]==T[j],继续比较S和T的下一个字符;
      •  否则,将i和j回溯(i=i-j+1,j=0),准备下一趟比较;
    3. 如果T中所有字符均比较完,则匹配成功,返回匹配的起始比较下标(i-j);否则,匹配失败,返回-1。
    4. 基本算法

int BF(char S[ ], char T[ ])

{

     i=0; j=0;   

    while (i<S.Length()&&j<T.length())

    {

         if (S[i]==T[j]) {

             i++;   j++;

         }  

         else {

             i=i-j+1;    j=0;

         }   

     }

     if (j>=T.length())  return (i-j);   

     else return -1;

}

  1. KMP(Knuth–Morris–Pratt)算法

——相较于bf算法省去大量的回溯,因为有next[j]的存在。

    1. next[j]表征着模式T中最大相同前缀子串和左子串(真子串)的长度。
    2. next[j]的算法也是一个模式匹配过程

void Compute_Next(char t[], int next[]){

int j,k;

       next[0]=-1;j=1;

while(t[j]!='\0'){

k=next[j-1];

while((k!=-1)&&(t[k]!=t[j-1]))

k=next[k];

next[j]=++k;

j++;

}}

(4)基本算法与BF类似,回溯时,根据next数组找到下一次匹配的位子即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值