29.模拟栈
描述:

思想:
使用vector容器来模拟栈保证其进行动态的扩容,同时再使用一个vector容器来记录当前栈中的最大值,保证随着元素的进栈和出栈,栈中的最大值都能够正确的记录下来。这里的元素删除操作并不是真正的删除,而是通过对应的下标做调整,元素的清空操作也只是把元素的下标值变为0,其实里面的元素并没有做一个实际上的删除操作。
代码:
#include <bits/stdc++.h>
using namespace std;
class myStack{
private:
int num;
vector<long long> stk;
vector<long long> maxd;
public:
myStack():num(0){
stk.resize(100000);
maxd.resize(100000);
}
int mypush(int data){
stk[num] = data;
if(num == 0){
maxd[num] = data;
}else{
if(maxd[num-1] > data){
maxd[num] = maxd[num-1];
}else{
maxd[num] = data;
}
}
num++;
return num;
}
int mypop(){
if(num == 0){
return -1;
}
int data = stk[num-1];
num--;
return data;
}
int myclear(){
if(num == 0){
return -1;
}
int data = maxd[num-1];
num = 0;
return data;
}
};
int main() {
int n;
cin >> n;
vector<long long> stk(n); // 栈的空间大小
int index = 0; // 对应的下标
long long maxdata = 0;
vector<long long> vec;
string str;
myStack mystk;
// 接收这里的换行符
getline(cin, str);
while(n--){
// string str;
getline(cin, str);
if(str.find("PUSH") != string::npos){
int idx = str.find(" ");
long long num = atoi(str.substr(idx+1).c_str());
// 压栈
cout << mystk.mypush(num) << endl;
}else if("POP" == str){
cout << mystk.mypop() << endl;
}else{
cout << mystk.myclear() << endl;
}
}
return 0;
}

浙公网安备 33010602011771号