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;
}
posted @ 2024-09-08 17:34  alone_qing  阅读(16)  评论(0)    收藏  举报