括號匹配問題(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;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM