美文网首页
C++-栈-Stack的语法呀2020-06-14

C++-栈-Stack的语法呀2020-06-14

作者: NO_OcaNE | 来源:发表于2020-06-14 16:51 被阅读0次

    基本概念

    属于数据结构的知识。LIFO,即last-in-fist-out。

    核心语法

    包头

    #include<stack>
    

    进栈,出栈,读出栈最上面的元素,即 push pop top

    #include <iostream>
    #include <stack>
    using namespace std;
    int main()
    {
        stack<int> myStack;
        for (int i = 0; i < 5; i++) 
        {
            myStack.push(i);
            cout << "push " << i << endl;
        }
        int tmp;
        while (!myStack.empty())
        {
            tmp = myStack.top();
            cout << "pop " << tmp << endl;
            cout << "size is " << myStack.size() << endl;
            myStack.pop();
        }
        return 0;
    }
    

    奇淫巧技

    将两个栈的内容互换

    A.swap(B) //A与B互换
    

    例题

    LeetCode-20

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
    有效字符串需满足:
    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。

    // test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <string>
    #include <stack>
    using namespace std;
    bool isValid(string s) {
            int len = s.size();
            if (len == 0)
            {
                return true;
            }
            if(len <= 1)
            {
                return false;
            }
            stack<char> myStack;
            char c;
            for (int i = 0; i < len; i++) 
            {
                if (s[i] == '(' || s[i] == '[' || s[i] == '{') 
                {
                    myStack.push(s[i]);
                }
                else 
                {
                    if (myStack.empty()) 
                    {
                        return false;
                    }
                    c = myStack.top();
                    if (c == '}' || c == ']' || c == ')') 
                    {
                        return false;
                    }
                    if ((s[i] == ')' && c == '(') || (s[i] == ']' && c == '[') || (s[i] == '}' && c == '{')) 
                    {
                        myStack.pop();
                    }
                    else 
                    {
                        return false;
                    }
                }
            }
            if (myStack.empty())
            {
                return true;
            }
            else
                return false;
        };
    int main()
    {
        string str = "((";
        if (isValid(str))
            cout << str << "is right";
        else
            cout << str << "is wrong";
        return 0;
    }
    

    其中采用map的方式进行匹配确定,可以简化算法

    class Solution {
    public:
        bool isValid(string s) {
            unordered_map<char,int> m{{'(',1},{'[',2},{'{',3},
                                    {')',4},{']',5},{'}',6}};
            stack<char> st;
            bool istrue=true;
            for(char c:s){
                int flag=m[c];
                if(flag>=1&&flag<=3) st.push(c);
                else if(!st.empty()&&m[st.top()]==flag-3) st.pop();
                else {istrue=false;break;}
            }
            if(!st.empty()) istrue=false;
            return istrue;
        }
    };
    

    相关文章

      网友评论

          本文标题:C++-栈-Stack的语法呀2020-06-14

          本文链接:https://www.haomeiwen.com/subject/crdxxktx.html