算法学习---栈和队列算法学习

一、用栈去实现队列

1.整理思路

栈的特点:先进后出
队列的特点:先进先出
我们要用栈的先进后出,来模拟实现队列的先进后出。我们需要借助两个栈去实现,分别叫做栈1和栈2。
栈1主要是用来存储数据的,我们将要插入的数据全部存放在栈1当中。
栈2主要是用来获取数据的:
首先判断栈2当中是否有数据,如果有,怎直接返回栈2的顶部元素。
如果没有,则将栈1当中的数据全部放入到栈2当中。

2.代码实现

public class Solution {Stack<Integer> stack1 = new Stack<Integer>();Stack<Integer> stack2 = new Stack<Integer>();//入栈函数public void push(int num) {stack1.push(num);    //要往栈中压入什么就直接用栈的push方法就好了}//出栈函数public Integer pop() {Integer re=null;if(!stack2.empty()){  // 如果栈2不是空的,那么把最上面那个取出来re=stack2.pop();}else{//如果栈2是空的,就把栈1里的数一个个取出来,放到栈2里while(!stack1.empty()){re=stack1.pop();stack2.push(re);}//栈2里有数之后,再次把里面的数取出来if(!stack2.empty()){re=stack2.pop();}}return re;}public static void main(String[] args) {Solution solution = new Solution();solution.push(1);solution.push(2);solution.push(3);solution.push(4);System.out.println(solution.pop());System.out.println(solution.pop());System.out.println(solution.pop());System.out.println(solution.pop());}}

二、用队列实现栈

1.整理思路

栈的特点:先进后出
队列的特点:先进先出
这里有两种实现方式:第一种是:用两个队列实现一个栈。第二种是用一个队列实现一个栈

2.两个队列实现一个栈

基本思路:使用两个队列,其中一个队列用来存放元素,另一个用来做辅助输出
1.入栈的时候,入到不为空的队列,刚开始都为空指定入到一个队列
2.入栈的时候,找到不为空的队列,出size-1个元素到另一个队列中,剩下的这个元素就是出栈的元素

public class QueueToStack<E> {private Queue<E> que1 = new LinkedList<>(); // 存放栈的元素private Queue<E> que2 = new LinkedList<>(); // 做一个辅助操作public void push(E e) {this.que1.offer(e);}public E pop() {// 从que1出队,把最后一个出队的元素返回E data = null;/*** 把que1里面的所有元素出队,放入que2里面,* 然后把que1最后一个出队的元素直接返回,不用放入que2*/while (!que1.isEmpty()) {data = que1.poll();  // poll() 从que1取出数据//  当取值取到最后一个的时候,返回为空 ,while循环结束if(que1.isEmpty()){break;}que2.offer(data);  //将取出来的数据放到que2当中}// 获取该出栈的元素以后,再把que2的元素再放入que1里面while(!que2.isEmpty()){que1.offer(que2.poll());}return data;}

3.一个队列实现一个栈

基本思路:使用两个队列,其中一个队列用来存放元素,另一个用来做辅助输出
1.入栈的时候,入到不为空的队列,刚开始都为空指定入到一个队列
2.入栈的时候,找到不为空的队列,出size-1个元素到重新插入到队列当中,剩下的这个元素就是出栈的元素

public class Stack<E> {private Queue<E> que1 = new LinkedList<>(); // 存放栈的元素public void push(E e) {this.que1.offer(e);}public E pop() {int size   = que1.size(); //获取队列当中的元素数量size = size - 1;while(size>0) {que1.offer(que1.poll());size--;}return que1.poll();}
}

三、判断元素出栈入栈的合法性

1.题目描述

判断元素出栈,入栈顺序的合法性如:
入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)是合法序列
入栈的序列(1,2,3,4,5),出栈序列为(1,5,3,2,4)是不合法序列

2.解题思路

1)我们可以用数组来进行存储入栈和出栈的序列,一个数组村的是入栈的序列另一个数组村的是出栈的序列。
2)用一个辅助栈,将入栈序列的第一个元素压栈,看是否和出栈序列的第一个元素相等。
3)如果相等则将辅助栈中的元素弹出去,继续比较入栈序列的下一个元素和出栈序列的下一个元素是否相等。
4)如果不相等继续将下一个入栈序列的元素压栈并且判断它是否与出栈序列中的当前元素匹配
若入栈序列遍历完毕,辅助栈为空 说明入栈序列中的元素和出栈序列中的元素匹配,返回true
若辅助栈不为空的话,说明不匹配,返回false

3.代码实现

public class QueueToStack{public static boolean validateStackSequences(int[] pushed, int[] popped) {Stack<Integer> stack = new Stack<>();int i = 0;for(int num : pushed) {stack.push(num); // num 入栈while(!stack.isEmpty() && stack.peek() == popped[i]) { // 循环判断与出栈stack.pop();i++;}}return stack.isEmpty();}public static void main(String[] args) {int[] pushed = new int[]{1,2,3,4,5};int[] popped = new int[]{5,4,3,2,1};System.out.println(QueueToStack.validateStackSequences(pushed,popped));}
}

四、返回栈的最小值时间是O(1)

1.题目描述

实现一个栈,要求实现出栈,入栈,Min(返回最小值的操作)的时间复杂度为o(1)

2.解法分析

使用两个栈,一个栈s,保存push的值,另一个栈作为辅助栈,保存当前最小值
push : 栈s插入值push(data),辅助栈min,如果为空或者插入的值data小于等于辅助栈的栈顶元素,辅助栈也插入data。
pop:栈s pop操作,辅助栈中的栈顶元素如果等于栈s的栈顶的话也执行pop操作。

3.代码实现

public class StackMin {static Stack<Integer> num = new Stack<>();static Stack<Integer> min = new Stack<>();// 入栈public static void push(Integer data){// 首先数据栈入栈num.push(data);//入栈 -----》辅助栈为空,或者有更小的值,将其存入辅助栈if (min.empty() || data<=min.peek()){min.push(data);}}// 出栈public static int pop(){//数据栈当前取出的元素是栈中最小的,则辅助栈也要弹出此元素if (num.peek() == min.peek()){min.pop();}return num.pop();}// 取出最小值public static void min(){//取当前最小元素if (!min.empty()){System.out.println(min.peek());}}public static void main(String[] args) {StackMin.push(4);StackMin.push(3);StackMin.push(5);StackMin.push(2);StackMin.min();StackMin.pop();StackMin.min();}
}

五、用一个数组实现两个栈

1.题目描述

用一个数组实现两个栈

2.解法分析

1.初始化两个下标变量分别指向数组的左右两端
2.左边的下标指示第一个栈,右边的下标指示第二个栈
3.如果需要对第一个栈执行元素入栈操作,那么将元素赋值到左边下标变量指示的位置
4.如果需要对第二个栈执行元素入栈操作,那么将元素赋值到右边下标变量指示的位置
5.第一个栈向右增长,第二个栈向左增长

3.代码实现

*** 使用一个数组实现两个栈* 栈和数组综合考察*/
public class ArrayWithTwoStacks {/*元数据数组*/private int[] dataArray;/*数组容量*/private int size;/*概念栈StackId=1的栈的指针*/private int topOne;/*概念栈StackId=1的栈的指针*/private int topTwo;public ArrayWithTwoStacks(int size) {//两个栈存在的边界条件size>=2if (size < 2) {throw new IllegalStateException("size < 2 is no persmissible");}dataArray = new int[size];this.size = size;topOne = -1;topTwo = size;}/*** 入栈操作** @param stackId* @param data*/public void push(int stackId, int data) {//是否满栈if (topOne + 1 == topTwo) {throw new IllegalStateException("Array is full!");//可以参入数组扩容操作,对当前数组现有元素进行重编,初始化栈指针}if (stackId == 1) {dataArray[++topOne] = data;} else if (stackId == 2) {dataArray[--topTwo] = data;} else {return;}}/*** 出栈** @param stackId* @return*/public int pop(int stackId) {if (stackId == 1) {if (topOne == -1) {throw new EmptyStackException();}return dataArray[topOne--];} else {if (topTwo == size) {throw new EmptyStackException();}return dataArray[topTwo++];}}/*** 栈顶元素** @param stackId* @return*/public int top(int stackId) {if (stackId == 1) {if (topOne == 1) {throw new EmptyStackException();}return dataArray[topOne];} else {if (topTwo == this.size) {throw new EmptyStackException();}return dataArray[topTwo];}}/*** 栈非空** @param stackId* @return*/public boolean isEmpty(int stackId) {if (stackId == 1) {return topOne == -1;} else if (stackId == 2) {return topTwo == this.size;} else {return true;}}}

六、有效的括号

1.题目要求

https://leetcode.cn/problems/valid-parentheses/

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意空字符串可被认为是有效字符串。

2.栈模拟三种不匹配的情况

①:第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
在这里插入图片描述
已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
②:第二种情况,括号没有多余,但是 括号的类型没有匹配上。
在这里插入图片描述
遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
③:第三种情况,字符串里右方向的括号多余了,所以不匹配。
在这里插入图片描述

3.代码实现

 class Solution {public boolean isValid(String s) {Deque<Character> deque = new LinkedList<>();char ch;for (int i = 0; i < s.length(); i++) {ch = s.charAt(i);//碰到左括号,就把相应的右括号入栈if (ch == '(') {deque.push(')');}else if (ch == '{') {deque.push('}');}else if (ch == '[') {deque.push(']');} else if (deque.isEmpty() || deque.peek() != ch) {return false;}else {//如果是右括号判断是否和栈顶元素匹配deque.pop();}}//最后判断栈中元素是否匹配return deque.isEmpty();}
}

七、删除字符串中所有相邻的重复项

1.题目要求

https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/

2.解题思路

1.多组相邻重复项,我们无论先删除哪一项,都不会影响最终结果。
2.删除当前项是需要拿上一项出来对比的,所以我们需要用临时栈存放之前的内容。
3.当前项和栈顶一致,弹出栈顶抵消即可。若不一致,压入栈留存,供后续使用。

3.代码实现

 public String removeDuplicates(String S) {Stack<Character> st = new Stack<>();for (int i = 0; i < S.length(); i++) {if (!st.empty() && S.charAt(i) == st.peek()) {st.pop();} else {st.add(S.charAt(i));}}StringBuilder res = new StringBuilder();for (Character c : st) {res.append(c);}return res.toString();}

八、逆波兰表达式求值

1.题目描述

https://leetcode.cn/problems/evaluate-reverse-polish-notation/

2.什么是逆波兰表达式

其实逆波兰表达式就是一种后缀表达式,后缀表达式是用来方便计算机来做运算的一种表达式。那我们首先先来了解一下逆波兰表达式!
首先来看一个正常的表达式:(1+2) * (3+4)
我们将其转换为二叉树的表现形式:
在这里插入图片描述
所谓的后缀表达式其实就是这颗二叉树的后序遍历,后序遍历的顺序是:左右中
那么既可以得出后缀表达式:12+34+*
而如果我们采用中序遍历:1+23+4 —》显然这样做我们需要加(),就成了(1+2) (3 +4)。
但是我们如果选择后序表达式就可以直接进行从前到后的遍历,不需要加括号。
因为计算机可以直接从前到后去遍历数据,所以计算机更加偏向于使用后缀表达式来进行计算。

三、如何使用栈计算

  • 如果遇到操作数,则将操作数入栈;
  • 如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈。

四、代码实现

class Solution {public int evalRPN(String[] tokens) {Deque<Integer> stack = new LinkedList<Integer>();int n = tokens.length;for (int i = 0; i < n; i++) {String token = tokens[i];if (isNumber(token)) {stack.push(Integer.parseInt(token));} else {int num2 = stack.pop();int num1 = stack.pop();switch (token) {case "+":stack.push(num1 + num2);break;case "-":stack.push(num1 - num2);break;case "*":stack.push(num1 * num2);break;case "/":stack.push(num1 / num2);break;default:}}}return stack.pop();}public boolean isNumber(String token) {return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));}
}

九、滑动窗口最大值

1.题目描述

https://leetcode.cn/problems/sliding-window-maximum/

2.解题思路

这道题不复杂,难点在于如何在 O(1)O(1) 时间算出每个「窗口」中的最大值,使得整个算法在线性时间完成这道题不复杂,难点在于如何在 O(1)时间算出每个「窗口」中的最大值,使得整个算法在线性时间完成。
在这里插入图片描述
1.遍历给定数组中的元素,如果队列不为空且当前考察元素大于等于队尾元素,则将队尾元素移除。直到,队列为空或当前考察元素小于新的队尾元素;
2.当队首元素的下标小于滑动窗口左侧边界left时,表示队首元素已经不再滑动窗口内,因此将其从队首移除。
3.由于数组下标从0开始,因此当窗口右边界right+1大于等于窗口大小k时,意味着窗口形成。此时,队首元素就是该窗口内的最大值。

三、代码实现

    public int[] maxSlidingWindow(int[] nums, int k) {// 窗口个数int[] res = new int[nums.length - k + 1];LinkedList<Integer> queue = new LinkedList<>();// 遍历数组中元素,right表示滑动窗口右边界for(int right = 0; right < nums.length; right++) {// 如果队列不为空且当前考察元素大于等于队尾元素,则将队尾元素移除。// 直到,队列为空或当前考察元素小于新的队尾元素while (!queue.isEmpty() && nums[right] >= nums[queue.peekLast()]) {queue.removeLast();}// 存储元素下标queue.addLast(right);// 计算窗口左侧边界int left = right - k +1;// 当队首元素的下标小于滑动窗口左侧边界left时// 表示队首元素已经不再滑动窗口内,因此将其从队首移除if (queue.peekFirst() < left) {queue.removeFirst();}// 由于数组下标从0开始,因此当窗口右边界right+1大于等于窗口大小k时// 意味着窗口形成。此时,队首元素就是该窗口内的最大值if (right +1 >= k) {res[left] = nums[queue.peekFirst()];}}return res;}

十、前k个高频元素

1.题目描述

https://www.bilibili.com/video/BV1Xg41167Lz/?spm_id_from=333.788&vd_source=8f6ce72f707c3f4e097b8deac48b496f

2.解题思路

首先遍历整个数组,并使用哈希表记录每个数字出现的次数,并形成一个「出现次数数组」。找出原数组的前 kk 个高频元素,就相当于找出「出现次数数组」的前 kk 大的值。
最简单的做法是给「出现次数数组」排序。但由于可能有 O(N)O(N) 个不同的出现次数(其中 NN 为原数组长度),故总的算法复杂度会达到 O(N\log N)O(NlogN),不满足题目的要求。
在这里,我们可以利用堆的思想:建立一个小顶堆,然后遍历「出现次数数组」:
如果堆的元素个数小于 kk,就可以直接插入堆中。
如果堆的元素个数等于 kk,则检查堆顶与当前出现次数的大小。如果堆顶更大,说明至少有 kk 个数字的出现次数比当前值大,故舍弃当前值;否则,就弹出堆顶,并将当前值插入堆中。
遍历完成后,堆中的元素就代表了「出现次数数组」中前 kk 大的值。

3.代码实现

class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> occurrences = new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault(num, 0) + 1);}// int[] 的第一个元素代表数组的值,第二个元素代表了该值出现的次数PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() {public int compare(int[] m, int[] n) {return m[1] - n[1];}});for (Map.Entry<Integer, Integer> entry : occurrences.entrySet()) {int num = entry.getKey(), count = entry.getValue();if (queue.size() == k) {if (queue.peek()[1] < count) {queue.poll();queue.offer(new int[]{num, count});}} else {queue.offer(new int[]{num, count});}}int[] ret = new int[k];for (int i = 0; i < k; ++i) {ret[i] = queue.poll()[0];}return ret;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派Python环境配置:删除Python 2、默认使用Python 3及配置Python镜像源指南

树莓派Python环境配置&#xff1a;优化升级三部曲 文章目录 树莓派Python环境配置&#xff1a;优化升级三部曲前言一、查看系统预装的python版本二、卸载python2并默认python3三、删除默认python3.7并升级到python3.9四、更换树莓派上的pip系统镜像源一键更换清华源&#xff08…

LoadRunner学习:RuntimeSetting、参数化、关联、(unfinished

LoadRunner RuntimeSetting 运行时设置 在Vuser中设置Run-time Settings RunLogic&#xff1a;运行逻辑&#xff0c;决定了脚本真正执行逻辑&#xff0c; Init和End部分代码只能执行一次。决定脚本真正执行逻辑的意思是&#xff0c;在Run中的代码和Number of Iteration决定了…

灵魂指针,教给(三)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、 字符指针变量 二、数组指针变量 2.1 数组指针变量是什么 2.2 数组指针变量如何初始化 三、二维数组传参本质 四、函数…

Redis + Caffeine = 王炸!!

在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。 随着不断的发展,这一架构也产生了改进,在…

Selenium控制已运行的Edge和Chrome浏览器(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令&#xff08;1&#xff09;Edge&#xff08;2&#xff09;Chrome 2. 执行python代码&#xff08;1&#xff09;先启动浏览器后执行代码&#xff08;2&#xff09;通过代码启动浏览器 3. 爬取效果3. 完整代码共享3.1 包含Excel部分的…

【数据结构】初识二叉搜索树(Binary Search Tree)

文章目录 1. 二叉搜索树的概念2. 二叉搜索树的操作1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它可能是一棵空树&#xff0c;也可能是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&am…

力扣L5----- 58. 最后一个单词的长度(2024年3月11日)

1.题目 2.知识点 注1&#xff1a; lastIndexOf()它用于查找指定字符或子字符串在当前字符串中最后一次出现的位置。它的作用是从字符串的末尾向前搜索指定字符或子字符串&#xff0c;并返回其最后一次出现的位置的索引。 &#xff08;1&#xff09;例如&#xff0c;在字符串 …

Rust入门:C++和Rust动态库(dll)的相互调用

无论是C调用Rust动态库还是Rust调用C动态库&#xff0c;其操作基本都是一样地简单&#xff0c;基本和C调用C的动态库没什么区别&#xff0c;只需要列出所需要导入的函数&#xff0c;并链接到相应的lib文件即可。 这里&#xff0c;在windows中&#xff0c;我们以dll动态库为例说…

OpenCV学习笔记(一)——Anaconda下载和OpenCV的下载

OpenCV是图象识别中有巨大的应用场景&#xff0c;本篇文章以Python为基础。当初学OpenCV的时候&#xff0c;推使用在Anaconda编写代码&#xff0c;原因比较方便&#xff0c;下面我们对于Anaconda的下载过程进行演示。 Anaconda的下载 首先打开官网www.anaconda.com/download找…

数据结构---C语言栈队列

知识点&#xff1a; 栈&#xff1a; 只允许在一端进行插入或删除操作的线性表&#xff0c;先进后出LIFO 类似一摞书&#xff0c;按顺序拿&#xff0c;先放的书只能最后拿&#xff1b; 顺序栈&#xff1a;栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…

设计模式-行为型模式-模版方法模式

模板方法模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[DP] 模板方法模式是通过把不变行为搬移到超类&#xff0c;去除子类中的重复代码来体现它的优势。 //首…

【Leetcode每日一题】 位运算 - 面试题 01.01. 判定字符是否唯一(难度⭐)(33)

1.题目解析 题目链接&#xff1a;面试题 01.01. 判定字符是否唯一 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于判断题目所给字符串是否存在相同字母&#xff0c;存在返回false即可&#xff0c;不存在返回true即可。 …

Caffeine缓存

本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远程缓存间的数据交互&#xff0c;减少网络 I/O 开销&#xff0c;降低这…

08 聚合函数

聚合函数 我们上一章讲到了 SQL 单行函数。实际上 SQL 函数还有一类&#xff0c;叫做聚合&#xff08;或聚集、分组&#xff09;函数&#xff0c;它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。 1.聚合函数介绍 什么是聚合函…

for、while、do...while循环的使用

本篇文章只记录for、while、do...while循环的使用&#xff0c;由于java循环较为简单&#xff0c;所以直接上代码。 1、for循环 需求&#xff1a;循环遍历求和 1-100。 public class Demo {public static void main(String[] args) {int sum 0;for (int i 1; i < 100; i…

YOLOv5目标检测学习(4):YOLOV5源码的文件结构解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言①py、cpp、java后缀的文件②md、txt、yml后缀的文件③yaml后缀的文件 一、.github文件夹1.1 workflows文件夹&#xff1a;该文件夹通常包含GitHub Actions 的工…

RHEL9 DNF/YUM仓库管理软件包

DNF/YUM仓库管理软件包 一个基于RPM包的软件包管理器能够从指定的服务器自动下载RPM包并且安装&#xff0c;自动处理依赖性关系&#xff0c;并且一次性安装所有依赖的软件包C/S模式 Server服务端提供RPM软件包与数据库文件repodataClient客户端使用dnf仓库 常用组合 组合参…

解决Klipper下位机ID获取失败问题

使用硬件&#xff1a; 上位机&#xff1a;必趣派&#xff0c;版本CB1_Debian11_Klipper_kernel5.16_20230303 下位机&#xff1a;八爪鱼STM32F407 问题&#xff1a;上位机获取下位机ID失败。 解决&#xff1a;咨询DIY群友&#xff0c;也对这个问题不太了解。我调试过程中&…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-1、线条平滑曲面(原始图形)

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

【vivado】 clock wizard 时钟IP

一、前言 MMCM和PLL是在FPGA设计中不可避免需要使用到的时钟资源&#xff0c;对于其功能及使用方法的理解是正确进行FPGA设计的前提。 二、Xilinx 时钟 IP配置 vivado中使用时钟向导(Clocking Wizard)配置时钟IP核&#xff0c;其框图如下&#xff1a; clk_in 输入时钟&#…