1. 模拟栈
思路:按照上面的思路,我们只需要设计一个数据结构,使得每个元素与其相应的最大值时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最大值。
- 当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最大值,与当前元素比较得出最大值,将这个最大值插入辅助栈中;
- 当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;
- 在任意一个时刻,栈内元素的最大值就存储在辅助栈的栈顶元素中,所以clear方法返回辅助栈的栈顶元素即可。
时间复杂度O(1),空间复杂度O(n)
#include <iostream>
#include<stack>
#include <string>
#include<vector>
using namespace std;
class MyStack{
private:
stack<int> s;
stack<int> maxv;
public:
MyStack(){}
int push(int val){
s.push(val);
if(maxv.size() == 0 || maxv.top() < val){
maxv.push(val);
}
else{
maxv.push(maxv.top());
}
return s.size();
}
int pop(){
if(s.empty() || maxv.empty()) return -1;
int val = s.top();
s.pop();
maxv.pop();
return val;
}
int clear(){
if(s.empty() || maxv.empty()) return -1;
int val = maxv.top();
while(!s.empty() && !maxv.empty()){
s.pop();
maxv.pop();
}
return val;
}
};
int main() {
int n;
cin>>n;
MyStack mys;
string s;
getline(cin, s);
for(int i = 0; i < n; ++i){
getline(cin, s);
if(s.substr(0,4) == "PUSH"){
cout<<mys.push(atoi(s.substr(5).c_str()))<<endl;
}
else if(s.substr(0,3) == "POP"){
cout<<mys.pop()<<endl;
}
else{
cout<<mys.clear()<<endl;
}
}
return 0;
}
2. 模拟队列
#include <iostream>
#include <queue>
using namespace std;
class MyQueue {
private:
queue<int> que;
public:
MyQueue() {}
int push(int val) {
que.push(val);
return que.size();
}
int pop() {
if (que.empty()) return -1;
int val = que.front();
que.pop();
return val;
}
int clear() {
int sum = 0;
while (!que.empty()) {
sum ^= que.front();
que.pop();
}
return sum;
}
};
int main() {
MyQueue myq;
int n;
cin >> n;
string s;
getline(cin, s);
for (int i = 0; i < n; ++i) {
getline(cin, s);
if (s.substr(0, 4) == "PUSH") {
cout << myq.push(atoi(s.substr(5).c_str())) << endl;
} else if (s.substr(0, 3) == "POP") {
cout << myq.pop() << endl;
} else {
cout << myq.clear() << endl;
}
}
return 0;
}