zoukankan      html  css  js  c++  java
  • 算法笔记--数据结构--队列

    队列的应用

    队列queue是一种先进先出的数据结构

    Snipaste_2020-04-02_10-36-48

    ​ 应当注意到,队列总是从队尾加入元素,而从队首移除元素,并且满足先进先出的规则。一般来说,需要一个队首指针front来指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素。和栈类似,当使用数组来实现队列时,队首指针front和队尾指针rear为int型变量(数组下标从0开始);而当使用链表来实现队列时,则为int*型变量的指针。这样当使用数组来实现上面的例子时,队首指针front和队尾指针rear的指向情况如图7-3所示。

    Snipaste_2020-04-02_10-42-50

    常见操作

    1. 获取队列内元素的个数size()
    2. 判空empty()
    3. 入队push()
    4. 出队pop()
    5. 取队首元素front()
    6. 取队尾元素back()

    上面的操作在C++ STL中的queue容器中可以方便的直接调用

    注意:在使用pop()front()back()函数之前必须先使用empty()进行判空

    STL中没有实现队列的清空,如果需要清空clear,可以使用while循环反复pop()出元素直到队列为空

    while(!q.empty()){
        q.pop();
    }
    

    实例

    问题 A: C语言-数字交换

    输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:1️⃣输入10个数;2️⃣进行处理;3️⃣输出10个数。
    

    输入

    10个整数
    

    输出

    整理后的十个数,每个数后跟一个空格(注意最后一个数后也有空格)
    

    输入样例

    2 1 3 4 5 6 7 8 10 9
    

    输出样例

    1 2 3 4 5 6 7 8 9 10
    

    解题

    #include <cstdio>
    #include <queue>
    #include <iostream>
    #include <limits.h>
    
    using std::queue;
    using std::cin; using std::istream;
    
    
    int MAX = INT_MIN;
    int MIN = INT_MAX;
    int MaxTemp, MinTemp;
    
    void read(istream& in, queue<int>& q){
        while(!q.empty()){
          q.pop();
        }
    
        int x;
        for (int i = 0; i != 10; ++i)
        {
          in >> x;
          q.push(x);
          if(x > MAX){
            MAX = x;
          }
          if(x < MIN){
            MIN = x;
          }
        }
      MinTemp = q.front();
      MaxTemp = q.back();
    }
    
    void deal(queue<int>& q, queue<int>& temp){
      while(!temp.empty()){
          temp.pop();
        }
    
          temp.push(MIN);
          q.pop();
          for (int i = 0; i != 8; ++i)
           {
             if(q.front() == MIN){
              q.front() = MinTemp;
            }
            temp.push(q.front());
            q.pop();
           }
           temp.push(MAX);
    
    
        while(!q.empty()){
          q.pop();
        }
    
        int flag = true;
        while(!temp.empty()){
    
            if(temp.front() == MAX){
              if(flag == true){
                temp.front() = MaxTemp;
              }
              flag = false;
            }
            q.push(temp.front());
            temp.pop();
      }
    }
    
    void print(queue<int>& result){
    
    
      while(!result.empty()){
        printf("%d ", result.front());
          result.pop();
      }
    
      printf("
    ");
    }
    
    int main(int argc, char const *argv[])
    {
      queue<int> q;
      queue<int> temp;
    
      read(cin,q);
      deal(q, temp);
      print(q);
    
      // printf("%d %d
    ", MAX, MIN);
    
      return 0;
    }
    

    Write by Gqq

  • 相关阅读:
    统计脚本代码行数
    expr算术运算
    lsof命令
    测试当前机器可以创建多少线程
    守护进程写日志
    文件描述符fd,struct files_struct
    linux查看反汇编
    信号补充
    Windows10获取VS管理员权限总是很烦人
    asp.net中的Filter类型其实是被当作单例的
  • 原文地址:https://www.cnblogs.com/zgqcn/p/12618705.html
Copyright © 2011-2022 走看看