1. 程式人生 > >簡單棧的應用之括號匹配

簡單棧的應用之括號匹配

常常我們在寫程式時,編譯程式碼能發現我們括號匹配正確與否,今天我們模擬實現一個簡單的括號匹配函式,用以複習棧的引用


#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;
}