棧的應用之括號的匹配
阿新 • • 發佈:2019-01-06
題目:假設表示式中允許包含三種括號:圓括號、方括號、花括號,其巢狀的順序隨意。
例題如下:
char a[] = "(())abc{[(])}"; // 左右括號次序匹配不正確
char b[] = "(()))abc{[]}"; // 右括號多於左括號
char c[] = "(()()abc{[]}"; // 左括號多於右括號
char d[] = "(())abc{[]()}"; // 左右括號匹配正確
分析過程(就按({} [])來分析):
當計算機接受了第一個“(”括號後,它期待與之相匹配的“)”括號出現,結果等來的是“{”括號,此時第一個括號“(”只能靠邊,而迫切等待與第二個括號相匹配的“}”出現,但等到了“[”,這時最迫切的等待匹配的就成了“]”。在第三個括號等到他匹配的之後,就會讓位與第二個括號,……,以此類推,可見這個處理過程恰好與棧的特點相吻合。
So,在演算法中設定一個棧,,每讀入一個括號,若是右括號,則將棧頂的括號pop彈出與之匹配。要不是則繼續push壓棧。另外,在演算法的開始和結束時,棧都應該是空的。
下面我們來看一下具體程式碼:
#include<iostream>
using namespace std;
#include<stack>
#include<assert.h>
//是否是括號
bool IsBrackets(char ch)
{
if(ch=='(' || ch==')' || ch=='[' || ch==']' || ch=='{' || ch=='}')
{
return true;
}
return false;
}
bool MatchBrackets(char* pStr)
{
//1.斷言
assert(pStr);
//2.求長度
int len = strlen(pStr);
stack<char> s;
for(int i=0; i<len; i++)
{
//
if(!IsBrackets(pStr[i]))
{
continue;
}
else
{
//左括號入棧
if(pStr[i]=='(' || pStr[i]=='[' || pStr[i]=='{' )
{
s.push(pStr[i]);
}
else //右括號
{
//判斷棧是否為空
if(s.empty())
{
cout<<"右括號多於左括號"<<endl;
return false;
}
//不為空
if(pStr[i]==')'&&s.top()=='(' || pStr[i]==']'&&s.top()=='[' || pStr[i]=='}'&&s.top()=='{')
{
s.pop();
}
else
{
cout<<"左右括號次序不匹配"<<endl;
return false;
}
}
}
}
if(!s.empty())
{
cout<<"左括號多於右括號"<<endl;
return false;
}
cout << "左右括號匹配正確" << endl;
return true;
}
void Test()
{
char a[] = "(())abc{[(])}"; // 左右括號次序匹配不正確
char b[] = "(()))abc{[]}"; // 右括號多於左括號
char c[] = "(()()abc{[]}"; // 左括號多於右括號
char d[] = "(())abc{[]()}"; // 左右括號匹配正確
cout << MatchBrackets(a) << endl;
cout << MatchBrackets(b) << endl;
cout << MatchBrackets(c) << endl;
cout << MatchBrackets(d) << endl;
}
int main()
{
Test();
return 0;
}
簡單寫到這,期待和你的交流