首页 > 代码库 > 栈的应用(Boolan)

栈的应用(Boolan)

  对源代码的语法检查是代码编译中的一个基础步骤,在语法分析阶段编译器会检查语法是否符合语言的规则。而在这个过程中对表达式括号匹配是一个必须的环节,例如“[()]"是合法的,"[(])"是非法的,对于括号的匹配问题通常有两种做法,一种是递归求解,另一种是通过栈结构迭代实现。下面主要讲解利用栈的实现。

  使用栈的主要实现算法为:

做一个空栈。读入字符直到文件尾。如果字符是一个开放符号,则将其推入栈中,如果字符是一个封闭符号,则当栈空时报错。否则将栈元素弹出,如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。

  下面是代码实例:

  

#include <iostream>
#include <stack>
#include <iomanip>

using namespace std;

bool validToken(char *token) {
    char *p = token;
    stack<char> stk;
    while (*p) {
        switch (*p) {
            case (:
            case [:
            case {:
                stk.push(*p);
                break;
            case ): {
                if (stk.empty() || stk.top() != ()
                    return false;
                stk.pop();
                break;
            }
            case ]: {
                if (stk.empty() || stk.top() != [)
                    return false;
                stk.pop();
                break;
            }
            case }: {
                if (stk.empty() || stk.top() != {)
                    return false;
                stk.pop();
                break;
            }
            default:
                break;
        }
        p++;
    }
    return stk.empty();
}

int main() {
    cout << boolalpha << validToken("{{[[]}") << endl;
    cout << boolalpha << validToken("{} {{{}}}") << endl;
    cout << boolalpha << validToken("()(({{[]}}))") << endl;
    cout << boolalpha << validToken("((([]])))") << endl;

    return 0;
}

 

栈的应用(Boolan)