コード ランダム レコーディング アルゴリズム トレーニング キャンプ 15 日目 11 | 20. 有効な括弧、1047. 文字列内の隣接する重複をすべて削除、150. ポーランド語式の逆評価

20. 有効な括弧 

キューを実装するスタックとスタックを実装するキューについて説明した後、次のステップはスタックの古典的なアプリケーションです。 

この質問は 3 つの状況を説明するものです。 

トピックリンク: Lituo

コードのアイデア: まず文字列の長さを判断します。文字列の長さが奇数であれば、明らかに質問の意味を満たしていないことがわかります。このとき、直接 false を返し、該当する文字列をトラバースして判断します。 3 つのシナリオ (その数) 括弧の場合は、対応するプッシュ操作を実行します (2 3 の場合) 次に、スタックを探します。top() は以下とは異なり、直接 false を返します/スタックが空の場合も false を返します。(ケース 1) 最後のステップは、スタックが空かどうかを返すことです。

class Solution {
public:
    bool isValid(string s) {

        //首先要进行判断奇数,如果要是奇数,直接返回false
        if(s.size()%2!=0)
        {
            return false;
        }

        //首先声明一个stack,用来存放对应的括号
        stack<char> panduan;

        for(int i = 0;i<s.size();i++)
        {
            if(s[i]=='(')
            {
                panduan.push(')');
            }
            else if(s[i]=='{')
            {
                panduan.push('}');
            }
            else if(s[i]=='[')
            {
                panduan.push(']');
            }

            else if(  panduan.empty()||s[i] != panduan.top() )//这个地方需要注意
            {
                return false;
            }

           else 
           {
               panduan.pop();
           }
        }
        return panduan.empty();
    }
};

1047. 文字列内の隣接する重複をすべて削除 --- 恋愛消去ゲーム

なぜスタックが愛の消去に似たこの種の操作に適しているのかを知るには、スタックは配列の現在の要素を走査するときに前の要素が何であるかを記録するのに役立つからです。

トピックリンク: Lituo

たとえば、以下に示すように、重複を削除した後の abbaca は c です。

アイデア: まず、文字列を格納するスタックを宣言し、末尾が現在の文字列と同じかどうかを尋ねます。同じ単語でポップアップが実行されます。

class Solution {
public:
    string removeDuplicates(string s) {

        //这道题是比较简单的

        //首先声明一个栈,用来存放相应的字符
        stack<char> cun;

        for(int i = 0;i<s.size();i++)
        {
            if(cun.empty()||cun.top()!=s[i])
            {
                cun.push(s[i]);
            }
            else
            {
                cun.pop();
            }
        }

        string result="";//存放返回值

        while(!cun.empty())//这个地方是不能够使用for进行判断的
        {
            result+=cun.top();
            cun.pop();
        }

        reverse(result.begin(),result.end());

        return result;


    }
};

150. 逆ポーランド語式の評価

この問題は難しくありませんが、初めて行うと考えるのが難しいため、最初にビデオを見て、概念を理解してから問題を実行してください

このトピックへのリンク:リコウ

class Solution {
public:
    int evalRPN(vector<string>& tokens) {

        //首先定义一个栈
        stack<long long> use;

        for(int i = 0;i<tokens.size();i++)
        {
            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
            {
                long long k1 = use.top();
                use.pop();
                long long k2 = use.top();
                use.pop();
                if(tokens[i]=="-")
                {
                    use.push(k2-k1);
                }

                if(tokens[i]=="+")
                {
                    use.push(k2+k1);
                }

                if(tokens[i]=="*")
                {
                    use.push(k2*k1);
                }

                if(tokens[i]=="/")
                {
                    use.push(k2/k1);
                }
            }
            else
            {
                use.push(stoll(tokens[i]));//stoll 将string转换为long long类型
            }
        }
        int result = use.top();
        use.pop();

        return result;
    }
};

おすすめ

転載: blog.csdn.net/m0_47489229/article/details/131006246