• 数据结构(四)--队列及面试常考的算法


    一、队列介绍

    1、定义

    与栈相似,队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO(后进先出),而队列是FIFO,即先进先出。

    2、优缺点及使用场景

    优点:先进先出(FIFO)特性、简单明了的接口、任务调度、广度优先搜索(BFS)、消息传递等。

    缺点:随机访问困难、固定容量的队列可能导致溢出、不适用于特定的场景、不适用于高并发场景。

    使用场景:任务调度、广度优先搜索(BFS)、消息传递等。

    3、基本操作

    Enqueue()——在队列尾部插入元素

    Dequeue()——移除队列头部的元素

    isEmpty()——如果队列为空,则返回true

    Top()——返回队列的第一个元素

    二、常考算法

    1、使用队列表示栈

    题目:使用队列实现栈的下列操作:

    • push(x) -- 元素 x 入栈
    • pop() -- 移除栈顶元素
    • top() -- 获取栈顶元素
    • empty() -- 返回栈是否为空

    思路用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。 

    1. #include
    2. #include
    3. using namespace std;
    4. class StackWithQueue{
    5. public:
    6. queue<int> queue1;
    7. queue<int> queue2; // 辅助队列,用来备份
    8. void push(int data){
    9. queue1.push(data);
    10. }
    11. int pop(){
    12. if (queue1.size() == 0) return false;
    13. while(queue1.size() > 1){
    14. queue2.push(queue1.front());
    15. queue1.pop();
    16. }
    17. int result;
    18. result = queue1.front(); // 留下的最后一个元素就是要返回的值
    19. queue1.pop();
    20. queue1 = queue2;
    21. while (!queue2.empty()){ //queue1 = queue2,queue2 = 空
    22. queue2.pop();
    23. }
    24. return result;
    25. }
    26. int top(){
    27. return queue1.back();
    28. }
    29. bool empty(){
    30. return queue1.empty();
    31. }
    32. };
    33. int main(){
    34. StackWithQueue stack;
    35. stack.push(1);
    36. stack.push(2);
    37. cout << stack.pop() << endl;
    38. cout << stack.top() << endl;
    39. stack.push(3);
    40. cout << stack.top() << endl;
    41. stack.push(4);
    42. cout << stack.pop() << endl;
    43. cout << stack.pop() << endl;
    44. cout << stack.pop() << endl;
    45. if (stack.empty()){
    46. cout << "True";
    47. }
    48. else cout << "False";
    49. }
    • 时间复杂度: pop为O(n),其他为O(1)
    • 空间复杂度: O(n)

    2、对队列的前k个元素倒序

    题目:现有一个整数队列, 需要将其前 k 个元素进行逆置, 剩余的元素保持原来的顺序。

    示例:input:[1,2, 3, 4, 5, 6, 7, 8, 9,10], k = 3;

               output:[3, 2, 1, 4, 5, 6, 7, 8, 9, 10]

    思路:将前k个元素入栈,再将栈中元素入新队列中,最后将原队列的剩余元素入新队列中。

    需要一个新队列用来装结果,需要一个栈用来对元素倒序。(利用栈先进后出,队列先进先出。 )

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. queue<int> reverse_k_elements(queue<int> queue, int k){
    6. stack<int> st;
    7. for(int i = 0; i < k; i++){
    8. st.push(queue.front());
    9. queue.pop();
    10. }
    11. while(!st.empty()){
    12. queue.push(st.top());
    13. st.pop();
    14. }
    15. for(int j = 0; j < queue.size() - k; j++){
    16. queue.push(queue.front());
    17. queue.pop();
    18. }
    19. return queue;
    20. }
    21. int main(){
    22. queue<int> queue, que;
    23. int i = 1;
    24. while(i < 11){
    25. queue.push(i);
    26. i++;
    27. }
    28. que = reverse_k_elements(queue, 3);
    29. while(!que.empty()){
    30. cout << que.front() << ',';
    31. que.pop();
    32. }
    33. }

    3、使用队列生成从1到n的二进制数

    题目:给定值k, 打印1到k的二进制数。

    示例:input:5;output:[1, 10, 11, 100, 101]

    思路:利用队列的先进先出性质和二进制数的特点来实现。以下是具体的思路:

    使用队列存储二进制数-->循环生成下一个二进制数-->重复直到达到n个二进制数。

    1. #include
    2. #include
    3. using namespace std;
    4. queue generate_binaray_numbers(int k){
    5. queue queue1, queue2;
    6. queue1.push("1");
    7. string cur;
    8. for(int i = 0; i < k; i++){
    9. cur = queue1.front();
    10. queue1.pop();
    11. queue2.push(cur);
    12. queue1.push(cur + "0");
    13. queue1.push(cur + "1");
    14. }
    15. return queue2;
    16. }
    17. int main(){
    18. queue que;
    19. que = generate_binaray_numbers(10);
    20. while(!que.empty()){
    21. cout << que.front()<
    22. que.pop();
    23. }
    24. return 0;
    25. }

     

  • 相关阅读:
    利用shp文件构建mask【MATLAB和ARCGIS】两种方法
    数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程(2)
    软件设计模式
    微信小程序开发前准备
    java计算机毕业设计高校学生体温管理系统源码+mysql数据库+系统+lw文档+部署
    【ETL工具】Datax-ETL-SqlServerToHDFS
    php单独使用laravel数据库
    flex实现三点骰子
    我眼中的大数据(二)——HDFS
    Autowired如何实现自动注入?
  • 原文地址:https://blog.csdn.net/bb8886/article/details/134133321