11.2算法(栈和队列Ⅱ)

5.3删除相邻重复项元素

class Solution {
public:
    string removeDuplicates(string s) {
        stack<int> st;
        for(char r : s){
            if(st.empty()||r!=st.top())//栈空或者当前字符不等于上一个字符时
                st.push(r);//入栈
            else 
                st.pop();//相等则出栈
        }
        string result = "";
        while(!st.empty()){//出栈
            result += st.top();
            st.pop();
        }
        reverse(result.begin(),result.end());//翻转字符
        return result;
    }
};

5.4逆波兰表达式

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(int i = 0;i<tokens.size();i++){
            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){//如果为操作符,则对栈顶两元素进行操作
                long long num1=st.top();
                st.pop();
                long long num2=st.top();
                st.pop();
                if(tokens[i]=="+") st.push(num2+num1);
                if(tokens[i]=="-") st.push(num2-num1);
                if(tokens[i]=="*") st.push(num2*num1);
                if(tokens[i]=="/") st.push(num2/num1);
            }
            else
                st.push(stoll(tokens[i]));//不为操作符,则将字符串元素入栈
        }
        long long result = st.top();
        st.pop();
        return result;
    }
};

5.5滑动窗口最大值

class Solution {
private:
    class MyQueue{
    public:
    deque<int> que;
    void pop(int value){//将队头相等于关键字的元素出队
         if(!que.empty()&&value == que.front())
            que.pop_front();
    }

    void push(int value){//
        while(!que.empty()&&value > que.front())
            que.pop_back();
        que.push_back(value);
    }

    int front(){
        return que.front();
    }
    };


    public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        vector<int> result;
        for(int i = 0;i<k;i++)
            que.push(nums[i]);
        result.push_back(que.front());
        for(int i = k;i<nums.size();i++){
            que.pop(nums[i-k]);
            que.push(nums[i]);
            result.push_back(que.front());
        }
        return result;
    }
    
};

6.1树的前、中、后序遍历

class Solution {
public:
    void Traversal(TreeNode* T,vector<int>& vec){
        if(T == nullptr) return;
        vec.push_back(T -> val);
        Traversal(T -> left,vec);
        Traversal(T -> right,vec);
    }

    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        Traversal(root,result);
        return result;
    }
};

//中序
void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    vec.push_back(cur->val);    // 中
    traversal(cur->right, vec); // 右
}

//后序
void traversal(TreeNode* cur, vector<int>& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    traversal(cur->right, vec); // 右
    vec.push_back(cur->val);    // 中
}
posted @ 2023-11-03 21:10  Ref-rain-  阅读(8)  评论(0)    收藏  举报