链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
请你实现一个队列。
操作:
push x:将 x x\ x 加入队尾,保证 x x\ x 为 int 型整数。
pop:输出队首,并让队首出队
front:输出队首:队首不出队
输入描述:
第一行为一个正整数 n n\ n ,代表操作次数。(1≤n≤100000)(1 \leq n \leq 100000)(1≤n≤100000)
接下来的 n n\ n ,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。
输出描述:
如果操作为push,则不输出任何东西。
如果为另外两种,若队列为空,则输出 "error“
否则按对应操作输出。
输入:
6
push 1
pop
front
push 2
push 3
pop
输出
1
error
2
答案:
#include<bits/stdc++.h>
using namespace std;
int s[100000];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int front=0,end=0;
int n;
cin>>n;
while(n--){
string m;
int k;
cin>>m;
if(m=="push"){
cin>>k;
s[end]=k;
end++;
}else if(m=="pop"){
if(front!=end){
cout<<s[front]<<endl;
s[front]=0;
front++;
}else{
cout<<"error"<<endl;
}
}else if(m=="front"){
if(front!=end){
cout<<s[front]<<endl;
}else{
cout<<"error"<<endl;
}
}
}
return 0;
}
解释:
在这里我是用数组的方法解题队列就是先进后出相当于一个有约束的数组,在本题中是用了正常的队列占用空间较大,若要节省空间可使用循环队列
ai解释:
这段代码实现了一个简单的队列(Queue)操作模拟,但有一点需要注意,它并没有完全遵循队列的严格定义,特别是在处理"pop"操作时。在标准的队列操作中,一旦元素被"pop"出队列,该元素应该从队列中完全移除,而不是仅仅将其值设置为0。不过,这里我们主要关注代码的逻辑和功能。
代码的主要功能包括:
- 初始化:通过
ios::sync_with_stdio(0);
和cin.tie(0); cout.tie(0);
来加速输入输出。 - 队列操作:通过
front
和end
两个指针来模拟队列的头部和尾部。front
指向队列的第一个元素(如果队列不为空),而end
指向队列中最后一个元素的下一个位置(即队列的容量)。 - 接收指令:循环接收指令,每次读取一个指令字符串
m
。根据指令的不同,执行不同的操作:"push"
:读取一个整数k
,将其添加到队列的末尾(s[end] = k; end++;
)。"pop"
:如果队列不为空(front != end
),则输出队列的第一个元素(s[front]
),然后将front
指针向前移动一位(front++
),并打印该元素的值。如果队列为空,则打印"error"
。"front"
:如果队列不为空,则输出队列的第一个元素(s[front]
)的值。如果队列为空,则打印"error"
。
注意:
- 代码中
s[front]=0;
这一行其实是不必要的,因为front
指针在pop
操作后会向前移动,即使不将s[front]
设置为0,也不会影响后续操作。而且,这样做可能会误导阅读代码的人,以为队列中的元素被物理删除了,而实际上只是通过移动指针来模拟删除。 - 在实际应用中,如果队列需要频繁地进行
pop
操作,并且队列的元素不是简单的整数,或者需要更复杂的操作(如保持元素的顺序等),可能需要使用标准库中的queue
容器或自己实现更复杂的队列结构。 - 此外,由于数组
s
的大小是固定的(这里为100000),如果n
非常大或者push
操作非常频繁,可能会导致数组越界。在实际应用中,可能需要考虑动态调整数组大小或使用链表等数据结构来实现队列。