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();
}
}