簡單棧的應用之括號匹配
阿新 • • 發佈:2019-02-18
常常我們在寫程式時,編譯程式碼能發現我們括號匹配正確與否,今天我們模擬實現一個簡單的括號匹配函式,用以複習棧的引用
#include<iostream>
#include<stack>
using namespace std;
bool is_Brackets(char ch)
{
if (ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}')
return true;
else return false;
}
bool is_left_Brackets(char ch)
{
if (ch == '(' || ch == '[' || ch == '{')
return true;
else return false;
}
int main(void)
{
char str[20];
char ch;
int i = 0;
scanf("%s",&str);
//cin >> str;
stack<char> sta;
while (str[i])
{
if (!is_Brackets(str[i]))
{
;
}
else
{
if (is_left_Brackets(str[i]))
{
sta.push(str[i]);
}
else
{
if (sta.empty())
{
printf("左括號缺少!!!");
return 0;
}
ch=sta.top();
switch (str[i])
{
case ')':
if (ch == '(')
{
sta.pop();
break;
}
else
{
printf("括號不匹配!!!");
return 0;
}
case ']':
if (ch == '[')
{
sta.pop();
break;
}
else
{
printf("括號不匹配!!!");
return 0;
}
case '}':
if (ch == '{')
{
sta.pop();
break;
}
else
{
printf("括號不匹配!!!");
return 0;
}
}
}
}
i++;
}
if (sta.empty())
printf("括號匹配!!!");
else printf("右括號缺少!!!");
return 0;
}
上面實現的有點水,下面實現一個優化過的版本(有百度過)
#include <iostream>
//#include <cmath>
#include <stack>
using namespace std;
bool judge(const char *);
char getType(const char);
bool match(const char, const char);
int main()
{
cout << "輸入待測序列:" << endl;
char seq[20];
cin >> seq; //讀取一個序列
cout << (judge(seq) ? "成功" : "失敗") << endl; //判斷並輸出結果
return 0;
}
//判斷字元型別 左括號,右括號 或 其他
char getType(const char c)
{
char bracketSet[] = "([{}])";
int i;
for (i = 0; i < 6; i++)
{
if (bracketSet[i] == c) break;
}
if (i<3) return 'l';
else if (i < 6) return 'r';
else return 'n';
}
//判斷是否為一對匹配的括號
bool match(const char cL, const char cR)
{
if (cL == '(')
return cR == ')' ? true : false;
else
return cR == cL + 2 ? true : false;
}
//判斷序列是否括號匹配
bool judge(const char * str)
{
stack<char> S; //新建一個棧
int i;
char bracketType;
for (i = 0; str[i] != '\0'; i++)
{
bracketType = getType(str[i]); //判斷是否為括號
if (bracketType == 'l')
{
S.push(str[i]); //遇到左括號,入棧
}
else if (bracketType == 'r')
{
//遇到左括號,與棧頂比較,若匹配,棧釋放頂層元素
if (match(S.top(), str[i])) S.pop();
//否則匹配失敗,結束函式
else return false;
}
}
//判斷棧內是否還有左括號,若無,則匹配成功
if (S.empty()) return true;
else return false;
}