第五章 栈与队列part01

48 阅读3分钟

第五章 栈与队列* part02*

20. 有效的括号

Code :

class Solution {
public:
    bool isValid(string s) {
        stack<char> stack_Symbol ;   //   (what we really need do Now ) ,  现在 需要 我们 往 前 上  , 要 做 xx  ,  而不是 xx
​
                                    // 集中 力量
        int i = 0;
​
        //int len_s = s.length();
​
        //for(i = 0 ; i < len_s ; i++)
        for(i = 0 ; s[i] != '\0' ; i++)
        {
        
            if(stack_Symbol.empty())
            {
                stack_Symbol.push(s[i]);
            }
            else
            {
                char Cache_Char = stack_Symbol.top();
                char Cache_Borther = Getborther(Cache_Char);
​
                if(Cache_Borther == s[i])
                {
                    stack_Symbol.pop();
                }
                else
                {
                    stack_Symbol.push(s[i]);
                }
​
​
            }
​
​
        }
​
        if(stack_Symbol.empty())
        {
            return 1;
​
        }
        else
        {
            return 0;
        }
​
​
​
    }
​
​
    char Getborther(char left)
    {
        switch(left)
        {
            case '(' :
                return ')';
            break;
​
            case '{' :
                return '}';
            break;
​
            case '[' :
                return ']';
            break;
​
​
        };
​
        return -1 ;
​
    }
};

1047. 删除字符串中的所有相邻重复项

思路 : 在 使用 栈 储存 数据 后 , 想要 顺序 输出 数据 , -> 使用 另一个 栈(Cache 栈) 配合 (数据 倒着 放过去 , 再 倒 着 输出)

Code :

class Solution {
public:
    string removeDuplicates(string s) {
​
        stack<char> stack_Alphabet ;
        stack<char> stack_Cache ;
        
        //stack<char> stack_ConvertCache ;
​
        int i = 0;
​
        for( i = 0 ; s[i] != '\0' ; i++)
        {
            if(stack_Alphabet.empty())
            {
                stack_Alphabet.push(s[i]);
            }
            else
            {
                char alphabet_Top = stack_Alphabet.top();
​
                if(alphabet_Top == s[i])
                {
                    stack_Alphabet.pop();
                }
                else
                {
                    stack_Alphabet.push(s[i]);
​
                }
​
            }
​
        }
​
        while(!stack_Alphabet.empty())
        {
            char Cache_Alphabet;
            Cache_Alphabet = stack_Alphabet.top();
            stack_Alphabet.pop();
​
            stack_Cache.push(Cache_Alphabet);
​
​
        }
​
​
​
​
        i = 0 ;
​
        //char * str_Receive ;
​
        char * str_Receive = new char[20001] ;
​
        while(!stack_Cache.empty())
        {
            str_Receive[i] = stack_Cache.top();
            stack_Cache.pop();
​
            i++;
​
        }
​
        str_Receive[i] = '\0';
​
        return str_Receive;
​
​
​
    }
};

150. 逆波兰表达式求值

注意 : 负数 检测 函数 段 不要 放 错 位置 了

Code :

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
​
        stack<int> stack_Digit ;
​
        // “新 据 点 ?”
​
        //“逆波兰 表达 式”
​
        //数字 压 栈 , 遇到 符号 , 提 数 (提 两个 数) , 计算 , 并 将 结果 压 栈 
​
        int len_tokens = tokens.size();
​
        int num_Target;
​
        int i = 0 ;
​
        for( i = 0 ; i < len_tokens ; i++ )
        {
            //int num_Tag = Check_If_Operator(tokens[i]);
            char num_Tag = Check_If_Operator(tokens[i]);
​
            int Cache_Num;
​
            int num2 ;
​
            int num1 ;
​
            int temp_Sum ;
​
            //cout<<'+'<<endl;
​
            //cout<<num_Tag<<endl;
​
                    // 代码 被 优化 了 ?
​
            switch(num_Tag)
            {
                case '0' :
                    Cache_Num = stoi(tokens[i]);
                    stack_Digit.push(Cache_Num);
                    //cout<<"push "<<Cache_Num<<endl;
​
                break ;
​
                case '+' :
                //case 1 :
                    num2 = stack_Digit.top();
                    stack_Digit.pop();
                    //cout<<"pop "<<num2<<endl;
                    num1 = stack_Digit.top();
                    stack_Digit.pop();
                    //cout<<"pop "<<num1<<endl;
​
                    temp_Sum = num1 + num2 ;
​
                    stack_Digit.push(temp_Sum);
                    //cout<<"push "<<temp_Sum<<endl;
​
                    //cout<<"temp_Sum = "<<temp_Sum<<endl;
​
                break ;
​
                case '-' :
                //case 2 :
                    num2 = stack_Digit.top();
                    stack_Digit.pop();
                    //cout<<"pop "<<num2<<endl;
                    num1 = stack_Digit.top();
                    stack_Digit.pop();
                    //cout<<"pop "<<num1<<endl;
​
                    temp_Sum = num1 - num2 ;
​
                    stack_Digit.push(temp_Sum);
                    //cout<<"push "<<temp_Sum<<endl;
​
                    //cout<<"temp_Sum = "<<temp_Sum<<endl;
​
                break ;
​
                case '*' :
                //case 3 :
                    num2 = stack_Digit.top();
                    stack_Digit.pop();
                    //cout<<"pop "<<num2<<endl;
                    num1 = stack_Digit.top();
                    stack_Digit.pop();
                    //cout<<"pop "<<num1<<endl;
​
                    temp_Sum = num1 * num2 ;
​
                    stack_Digit.push(temp_Sum);
                    //cout<<"push "<<temp_Sum<<endl;
​
                    //cout<<"temp_Sum = "<<temp_Sum<<endl;
​
                break ;
​
                case '/' :
                //case 4 :
                    num2 = stack_Digit.top();
                    stack_Digit.pop();
                    //cout<<"pop "<<num2<<endl;
                    num1 = stack_Digit.top();
                    stack_Digit.pop();
                    //cout<<"pop "<<num1<<endl;
​
                    temp_Sum = num1 / num2 ;
​
                    stack_Digit.push(temp_Sum);
                    //cout<<"push "<<temp_Sum<<endl;
​
                    //cout<<"temp_Sum = "<<temp_Sum<<endl;
​
                break ;
​
                case '1' :
                    cout<<"Error evalRPN tokens["<<i<<"]  为 其它字符" << endl;
​
                break;
​
​
            }
​
​
        }
​
        
        num_Target = stack_Digit.top();
        stack_Digit.pop();
​
        //cout<<"11111111111111111111"<<endl;
                                    //  xx  与  xx  的  Combination
​
        return num_Target;
​
​
​
    }
​
    /*
    bool Is_Digit()
    {
​
    }
    */
​
    char Check_If_Operator(string str_In)
    {
        int len_str_In;
​
        //cout<<"str_In = "<<str_In<<endl;
​
        switch(str_In[0])
        {
            case '+' :
                return '+';
                //return 1;
            break;
​
            case '-' :
                len_str_In = str_In.length();
​
                if(len_str_In >=2)
                {
                    return '0';         //注意 在 字符 中, 0 和 字符 0 是 不一样 的
                }
                else
                {
                    return '-' ;
                    //return 2;
                }
​
                
            break;
​
            case '*' :
                return '*';
                //return 3;
            break;
                            
            case '/' :
                                //注意 :负数 检测 函数 段  不要 放 错 位置 了
                                // “之前 负数 检测 函数 段 错 放 到 了 这里”
                return '/';
                //return 4;
            break;
​
​
            default :   
                                
                return '0';
​
            break;
                                    //这里 简化 了 处理  数字 字符串 期望 的 第一个 字符   , 当( 数字 字符串 ) 以 '-' 起始 字符串 长度 至少 为 2 , " >= 2"
                           //  这里 设定 的 范围 '0','1','2','3','4','5','6','7','8','9','+','-',
            
​
​
        };
​
​
        return '1';
​
    }
​
};