题目要求
请实现一个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; } } }
总结
该题考察队列的数组实现,读者可躬身实践。
我是秋说,我们下次见。