一、栈基础
(1)常用操作:push pop top
 (2)最小栈:最小栈也是一个栈(存的元素都是数字),只不过这种数据结构除了有push、pop、top等和普通栈相同的方法外,还有一个方法get_min用来获取当前栈中的最小元素。
二、20. 有效的括号
1 题目

2 解题思路
(1)左括号入栈
 (2)右括号出栈,并且出栈的左括号要和当前右括号对应,且栈不为空
 
 
3 code
class Solution {
public:
    bool isValid(string s) {
        unordered_map<char,int> dict{{'{',1},{'(',2},{'[',3},{'}',4},{')',5},{']',6} };
        stack<int> st;
        // char c;
        for(char c:s)
        {
            // 左括号入栈
            if(dict[c]<4)
            {
              st.push(dict[c]);
            }             
            else
            {
                if(!st.empty() && st.top()==(dict[c]-3))
                {
                    st.pop();
                }
                else   
                {
                    return false;
                }
            }
        }
        if(st.empty())return true;
        return false;
    }
};
三、155. 最小栈
1 题目

2 解题思路
(1)我们可以创建两个栈,一个栈是主栈 stackstackstack,另一个是辅助栈 minStackminStackminStack,用于存放对应主栈不同时期的最小值。
 
3 code
class MinStack {
    stack<int> x_stack;
    // 辅助栈
    stack<int> min_stack;
public:
    MinStack() {
        min_stack.push(INT_MAX);
    }
    
    void push(int val) {
        x_stack.push(val);
        // 辅助栈
        min_stack.push(min(min_stack.top(),val));
    }
    
    void pop() {
        x_stack.pop();
        // 辅助栈
        min_stack.pop();
    }
    
    int top() {
        return x_stack.top();
    }
    
    int getMin() {
        return min_stack.top();
    }
};
/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */
四、394. 字符串解码
1 题目

2 解题思路
(1)这题看到括号的匹配,首先应该想到的就是用栈来解决问题。
3 code
class Solution {
public:
    string decodeString(string s) {
        string res="";
        stack<int> nums;
        stack<string> strs;
        int num=0;
        int len=s.size();
        for(int i=0;i<len;++i)
        {
            if(s[i]>='0' && s[i]<='9')
            {
                num=num*10+s[i]-'0';
            }
            else if((s[i]>='a'&&s[i]<='z') || (s[i]>='A' && s[i]<='Z'))
            {
                res=res+s[i];
            }
            else if(s[i]=='[') //将'['前的数字压入nums栈内,字母字符串压入strs栈内
            {
                nums.push(num);
                num=0;
                strs.push(res);
                res="";
            }
            else //遇到']'时,操作与之相配的'['之间的字符,使用分配律
            {
                int times=nums.top();
                nums.pop();
                for(int j=0;j<times;++j)
                {
                    strs.top()+=res;
                }
                res=strs.top(); // 之后若还是字母,就会直接加到res之后,因为他们是同一级的运算
                               // 若是左括号,res会被压入strs栈,作为上一层的运算
                strs.pop();
            }
        }
        return res;
    }
};
五、739. 每日温度
1 题目

2 解题思路
3 code
class Solution {
public:
    vector<int> dailyTemperatures(vector<int> &temperatures) {
        int n = temperatures.size();
        vector<int> ans(n);
        stack<int> st;
        for (int i = 0; i < n; i++) {
            int t = temperatures[i];
            while (!st.empty() && t > temperatures[st.top()]) {
                int j = st.top();
                st.pop();
                ans[j] = i - j;
            }
            st.push(i);
        }
        return ans;
    }
};



















