C++/PTA 队列操作

简介: 请实现一个MyQueue类,实现出队,入队,求队列长度.

题目要求

请实现一个MyQueue类,实现出队,入队,求队列长度.


实现入队函数 void push(int x);

实现出队函数 int pop();

实现求队列长度函数 int size();


输入格式:

每个输入包含1个测试用例。每个测试用例第一行给出一个正整数 n (n <= 10^6) ,接下去n行每行一个数字,表示一种操作:

1 x : 表示从队尾插入x,0<=x<=2^31-1。

2 : 表示队首元素出队。

3 : 表示求队列长度。


输出格式:

对于操作2,若队列为空,则输出 “Invalid”,否则请输出队首元素。 对于操作3,请输出队列长度。

每个输出项最后换行。


输入样例:

5

3

2

1 100

3

2


输出样例:

0

Invalid

1

100


解题思路

这段代码是一个使用数组实现的队列,主要思路如下:


定义 MyQueue 类,包含私有变量 val 和 front,公有函数 push、pop、size 和构造函数 MyQueue。


构造函数用于初始化对象。


push 函数将元素 x 添加到队列的末尾。具体实现是将 x 存入数组 val 中 front 位置(队尾),同时将 front 加一,以便下一次插入时放在新的位置。


size 函数返回 front,即队列中现有元素的数量。


pop 函数弹出队列的队首元素,并返回其值。当队列为空时,返回 -1。否则,将队列中所有元素往前移动一位,让队列头指针 front 减一,返回弹出的队首元素。


主函数中读入整数 n,表示有 n 次操作。通过创建一个 MyQueue 类的对象,对对象进行入队、出队、查询队列大小等操作,并输出相应结果。


通过 switch 语句来处理每种不同的操作,例如:1 表示在队列尾部插入元素,2 表示弹出队首元素并输出其值,3 表示输出队列元素个数。


代码

#include<iostream>
#include<cstring>
using namespace std;
class MyQueue//定义一个MyQueue类
{
  private:
  int val[1000] ;//定义一个 int 类型的数组存储队列元素
  int front = 0;//front 表示队首元素的下标
  public:
  void push(int x);//在队尾添加元素
  int pop();//弹出队首元素并返回其值
  int size();//返回队列中元素个数
  MyQueue();//构造函数
};



这里定义了一个 MyQueue 类,包含私有变量 val 和 front,公有函数 push、pop、size 和构造函数 MyQueue。


MyQueue::MyQueue() //构造函数
{
}


构造函数,用于初始化对象。

void MyQueue::push(int x)//在队尾添加元素
{
    val[front++] = x;//将 x 添加到队列的末尾
}


push 函数将元素 x 添加到队列的末尾。具体实现是将 x 存入数组 val 中 front 位置(队尾),同时将 front 加一,以便下一次插入时放在新的位置。


int MyQueue::size()//返回队列中元素个数
{
    return front;//直接返回当前队列的元素个数
}


size 函数返回 front,即队列中现有元素的数量。

int MyQueue::pop()//弹出队首元素并返回其值
{
    if (front == 0) {//判断队列是否为空
        return -1;//如果为空,返回 -1
    } else {//否则,取出队头,并将队列头指针移动一位
        int ret = val[0];//取出队首元素
        for (int i = 0; i < front-1; i++) {//将队列中所有元素往前移动一位
            val[i] = val[i+1];
        }
        front--;//队列头指针减一
        return ret;//返回弹出的队首元素
    }
}


pop 函数弹出队列的队首元素,并返回其值。当队列为空时,返回 -1。否则,将队列中所有元素往前移动一位,让队列头指针 front 减一,返回弹出的队首元素。


int main()
{
    int n;
    cin>>n;
    MyQueue s;//创建队列对象
    int num;
    int x;
    for (int i = 0; i < n; i++) {
        cin>>num;
        switch(num) {
            case 1:
                cin>>x;
                s.push(x);//在队列尾部插入元素
                break;
            case 2:
                x = s.pop();
                if (x == -1) {//判断是否弹出成功
                    cout<<"Invalid"<<endl;
                } else {
                    cout<<x<<endl;//输出弹出的元素值
                }
                break;
            case 3:
                cout<<s.size()<<endl;//输出队列元素个数
                break;
        }
    }
}



主函数中读入整数 n,表示有 n 次操作。通过创建一个 MyQueue 类的对象,对对象进行入队、出队、查询队列大小等操作,并输出相应结果。


总代码如下:


#include<iostream>
#include<cstring>
using namespace std;
{
  private:
  int val[1000] ;
  int front = 0;//the first
  public:
  void push(int x);
  int pop();
   int size();
   MyQueue();
};
  MyQueue::  MyQueue()
  {
  }
void MyQueue :: push(int x)
  {
    val[front++] = x;
  }
int  MyQueue :: size()
  {
    return front;
  }
int MyQueue :: pop()
  {
    if(front == 0) 
    {
    return -1;
    }else
    {
                for(int i = 0; i < front-1; i++)
                {
                    val[i] = val[i+1];
                }
                front--;
    return val[0];
    } 
   } 
int main()
{
  int n;
  cin>>n;
  MyQueue s;
  int num;
  int x;
  for(int i = 0; i < n; i++)
  {
  cin>>num;
  switch(num)
  {
    case 1:
      cin>>x;
      s.push(x);
      break;
    case 2:
                    x = s.pop();
      if(x == -1)
      {
      cout<<"Invalid"<<endl;
      }else
      {
      cout <<x<<endl;
      }
      break;
    case 3:
      cout<<s.size()<<endl;
      break;    
  }
  }
 }


总结

该题考察队列的数组实现,读者可躬身实践。

我是秋说,我们下次见。

目录
相关文章
|
4月前
|
C++ 容器
C++中向量的操作vector
C++中向量的操作vector
|
22天前
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
36 7
|
22天前
|
消息中间件 存储 安全
|
3月前
|
存储 设计模式 算法
【C++】deque以及优先级队列
【C++】deque以及优先级队列
|
5月前
|
设计模式 存储 C++
【C++/STL】:stack/queue的使用及底层剖析&&双端队列&&容器适配器
【C++/STL】:stack/queue的使用及底层剖析&&双端队列&&容器适配器
68 2
|
5月前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
92 10
|
5月前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
61 2
|
5月前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
4月前
|
存储 算法 C语言
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
|
5月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
252 0