码迷,mamicode.com
首页 > 其他好文 > 详细

栈的应用(Boolan)

时间:2017-03-16 21:57:40      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:括号   namespace   val   报错   通过   iostream   blog   style   class   

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

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

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

  下面是代码实例:

  

#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)

标签:括号   namespace   val   报错   通过   iostream   blog   style   class   

原文地址:http://www.cnblogs.com/docliff/p/6561660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!