1. 程式人生 > >DS堆疊--括號匹配

DS堆疊--括號匹配

處理表達式過程中需要對括號匹配進行檢驗,括號匹配包括三種:“(”和“)”,“[”和“]”,“{”和“}”。例如表示式中包含括號如下:

(	)	[	(	)	(	[	]	)	]	{	}
1	2	3	4	5	6	7	8	9	10	11	12

從上例可以看出第1和第2個括號匹配,第3和第10個括號匹配,4和5匹配,6和9匹配,7和8匹配,11和12匹配。從中可以看到括號巢狀的的情況是比較複雜的,使用堆疊可以很方便的處理這種括號匹配檢驗,可以遵循以下規則:

1、 當接收第1個左括號,表示新的一組匹配檢查開始;隨後如果連續接收到左括號,則不斷進堆疊。

2、 當接受第1個右括號,則和最新進棧的左括號進行匹配,表示巢狀中1組括號已經匹配消除

3、 若到最後,括號不能完全匹配,則說明輸入的表示式有錯

建議使用C++自帶的stack物件來實現

 

stack類使用的參考程式碼

n包含標頭檔案<stack>  :  #include <stack>

n建立一個堆疊物件s(注意stack是模板類):stack <char>  s; //堆疊的資料型別是字元型

n把一個字元ct壓入堆疊: s.push(ct);

n把棧頂元素彈出:s.pop();

n獲取棧頂元素,放入變數c2: c2 = s.top();

n判斷堆疊是否空: s.empty(),如果為空則函式返回true,如果不空則返回false

 

輸入

第一行輸入一個t,表示下面將有t組測試資料。接下來的t行的每行輸入一個表示式,表示式只考慮英文半形狀態輸入,無需考慮中文全形輸入

輸出

對於每一行的表示式,檢查括號是否匹配,匹配則輸入ok,不匹配則輸出error

樣例輸入

2 (a+b)[4*5+(-6)] [5*8]/{(a+b)-6

樣例輸出

ok error

提示

 

演算法流程

 

1、初始化,i=0,建立堆疊,棧為空

2、輸入表示式,建立指標指向表示式的頭部

3、讀入表示式的第i個字元

4、如果第i個字元是左括號,入棧

5、如果第i個字元是右括號,檢查棧頂元素是否匹配

   A.如果匹配,彈出棧頂元素

   B.如果不匹配,報錯退出

6、i++,指向下一個字元,是否已經表示式末尾

   A. 未到末尾,重複步驟3

   B. 已到達末尾

      a. 堆疊為空,輸出ok

      b. 堆疊不為空,輸出error

 

#include <iostream>
#include <stack>
#include <string>

using namespace std;
void test()
{
    string T;
    int flag=0;
    cin>>T;
    stack<char> Q;
    int j;
    char temp;
    for(int i=0;i<T.length();i++)
    {
        if(T[i]=='{'||T[i]=='('||T[i]=='[')
            Q.push(T[i]);
        else
        {
            if(T[i]==')')
            {
                if(Q.empty())
                    flag=1;
                else
                {
                    temp=Q.top();
                    Q.pop();
                    if(temp!='(')
                        flag=1;
                }
            }
            if(T[i]==']')
            {
                if(Q.empty())
                    flag=1;
                else
                {
                    temp=Q.top();
                    Q.pop();
                    if(temp!='[')
                        flag=1;
                }
            }
            if(T[i]=='}')
            {
                if(Q.empty())
                    flag=1;
                else
                {
                    temp=Q.top();
                    Q.pop();
                    if(temp!='{')
                        flag=1;
                }
            }
        }
    }
    if(Q.empty()&&flag==0)
        cout<<"ok"<<endl;
    else
        cout<<"error"<<endl;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        test();
    }
}