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
解题思路
这段代码是一个使用数组实现的队列,主要思路如下:
-
定义
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;
}
}
}
总结
该题考察队列的数组实现,读者可躬身实践。
我是秋说,我们下次见。