C++/PTA 队列操作

题目要求

请实现一个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

解题思路

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

  1. 定义 MyQueue 类,包含私有变量 valfront,公有函数 pushpopsize 和构造函数 MyQueue

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

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

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

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

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

  7. 通过 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 类,包含私有变量 valfront,公有函数 pushpopsize 和构造函数 MyQueue

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

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

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

push 函数将元素 x 添加到队列的末尾。具体实现是将 x 存入数组 valfront 位置(队尾),同时将 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;			
		}
	}
 } 

总结

该题考察队列的数组实现,读者可躬身实践。
我是秋说,我们下次见。

posted @ 2023-05-14 23:08  秋说  阅读(99)  评论(0编辑  收藏  举报  来源