数据结构与算法分析c++:栈的应用(2)

来源:互联网 发布:linux svn服务器配置 编辑:程序博客网 时间:2024/05/16 12:15

括号匹配

检测括号匹配是比较常见的功能需求,比如编写代码时,往往因为多了一个括号(当然少了也不行),编程工具,例如vs,会提示大批量的错误,这时我们往往找到对应缺失的括号添加或去除就可以了。利用栈就可以很高效的实现这一功能。我们仅就圆括号、方括号、花括号的检测为例进行简要的阐述。

算法原理阐述

做一个空栈。读入字符知道字符串尾部。如果字符是一个开放字符(“(”、“[”、“{”),入栈;如果字符是一个封闭字符(“)”、“]”、“}”),若栈为空,则报错,若栈非空,则判断栈顶的开放字符是否和该封闭字符对应,若对应,则弹出栈顶元素,若不对应,则报错。字符串处理完毕后检测栈的情况,若非空则报错。

下面依照算法原理的阐述,编写代码。

#include <iostream> #include <stack>#include <string>using namespace std;bool paren(const string expression) {    stack<char> s;    for (int i = 0; i < expression.length(); i++) {        if (expression.at(i) == '(' ||            expression.at(i) == '{' ||            expression.at(i) == '[') {            s.push(expression.at(i));        }        else if (expression.at(i) == ')' ||            expression.at(i) == '}' ||            expression.at(i) == ']') {            if (s.empty()) {                return false;            }            else{                switch (expression.at(i))                {                case ')':                    if (s.top() != '(') {                        return false;                    }                    else{                        s.pop();                        break;                    }                case '}':                    if (s.top() != '{') {                        return false;                    }                    else{                        s.pop();                        break;                    }                case ']':                    if (s.top() != '[') {                        return false;                    }                    else{                        s.pop();                        break;                    }                default:                    return false;                }            }        }    }    return s.empty();}

代码测试。

int main(int argc, char* argv[]){    cout << "input expression" << endl;    //string line;      //cin >> line;    string line;     getline(cin, line);    if (paren(line)) {        cout << "parens in expression are matched..." << endl;    }    else {        cout << "parens in expression are not matched..." << endl;    }    system("pause");    return 0;}

关于测试代码,字符串的读入有很多方式,

    string line;        cin >> line;

这种方式无法读入带空格的字符串;

    string line;     getline(cin, line);

这种方式可以读取一行,以回车符为结束符;
当然还有很多方式,比如读段落等,有人这样实现,

    string s;      int n;      cin>>n;      cin.ignore();      for(int i=0;i<n;i++)      {          getline(cin,s);          cout<<s<<endl;      } 

但是需要确定n的大小,固定了行数,这不是我们期望的。
方式有很多,小伙伴可以根据自己需要进行编写,当然这不属于本文的讨论内容,有兴趣的小伙伴可以自己多研究研究。下面看一下结果。
这里写图片描述

这里写图片描述

阅读全文
0 0
原创粉丝点击