• 括号匹配问题(C++、堆栈)


    原文地址:http://www.cppblog.com/GUO/archive/2010/09/12/126483.html  

    /*
    括号匹配问题,比较经典,利用堆栈来实现(摘自internet)
    
    1. 括号匹配的四种可能性:
    
    ①左右括号配对次序不正确
    ②右括号多于左括号
    ③左括号多于右括号
    ④左右括号匹配正确
    
    2. 算法思想:
    
    顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
    当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
    若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确;
    若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号;
    字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号;
    否则,括号配对正确。
    
    3. 程序实现:
    */
    #include <iostream>
    using namespace std;
    
    #define maxsize 100
    
    struct sStack
    {
         char sign[maxsize];
         int top;
    };
    
    int InitsStack(sStack &SS)
    {
         SS.top=-1;
         return 1;
    }
    
    int IsEmptysStack(sStack &SS)
    {
         if(SS.top==-1)
             return 1;
         return 0;
    }
    
    int PushsStack(sStack &SS,char c)
    {
         SS.sign[++SS.top]=c;
         return 1;
    }
    
    int UpsStack(sStack &SS)
    {
        if(IsEmptysStack(SS))
        {
             cout<<"栈空"<<endl;
             return 0;
        }
        SS.top--;
        return 1;
    }
    
    char TopsStack(sStack &SS)
    {
        if(IsEmptysStack (SS))
        {
             cout <<"栈空"<<endl;
             return 0;
        }
        return SS.sign[SS.top];
    }
    
    int main()
    {
         string s;
         cout<<"输入表达式:";
         cin>>s;
         int length=s.length();
         int i;
         sStack SS;
         InitsStack(SS);
         for(i=0;i<length;++i)
         {
               if(s[i]=='('||s[i]=='['||s[i]=='{')
                        PushsStack(SS,s[i]);
               else if(s[i]==')'&&!IsEmptysStack(SS)&&TopsStack(SS)=='(')
                    UpsStack(SS);         
               else if(s[i]==')'&&!IsEmptysStack(SS)&&TopsStack(SS)!='(')
                        cout<<"括号匹配次序不正确"<<endl;
               else if(s[i]==']'&&!IsEmptysStack(SS)&&TopsStack(SS)=='[')
                        UpsStack(SS);
               else if(s[i]==']'&&!IsEmptysStack(SS)&&TopsStack(SS)!='[')
                        cout<<"括号匹配次序不正确"<<endl;
               else if(s[i]=='}'&&!IsEmptysStack(SS)&&TopsStack(SS)=='{')
                        UpsStack(SS);
               else if(s[i]=='}'&&!IsEmptysStack(SS)&&TopsStack(SS)!='{')
                        cout<<"括号匹配次序不正确"<<endl;
               else if((s[i]==')'||s[i]==']'||s[i]=='}')&&IsEmptysStack(SS))
                        cout<<"右括号多于左括号"<<endl;
         }
         if(!IsEmptysStack(SS))
               cout<<"左括号多于右括号"<<endl;
         else if(i=(length-1)&&IsEmptysStack(SS))
               cout<<"括号匹配正确"<<endl;
                   
         system("PAUSE");
         return 0;
    }
    

      

  • 相关阅读:
    创建github怎样管理
    端口号的作用
    正则
    分布式代码管理github
    实现MVC
    AngularJS核心特性(四大点)
    什么是跨域,什么是同源
    rem怎么计算
    正则须知(以后还会添加)
    LA 6448 Credit Card Payment
  • 原文地址:https://www.cnblogs.com/niaowo/p/4077608.html
Copyright © 2020-2023  润新知