平衡的括号问题

平衡的括号 

  要运用栈的一些知识,STL。

栈的特点是“先进后出”。

 

头文件是<stack>,声明方式:"stack<int> s"。

主要操作:

push():把元素压入“栈顶”,又称入栈

pop():从栈顶把元素弹出,出栈

top():取栈顶元素(但不删除)

size():测栈长(个数)

empty():判断栈是否为空

 

题目大意:

输入一个包含“()”和“[]”的括号序列,判断是否合法。具体规则如下:

(1)空串合法;(2)如果A和B都合法,则AB合法;(3)如果A合法则(A)和[A]都合法。

题目分析:

先要测出字符串的长度,如果串长==0,是合法的,输出Yes。接着判断第一个字符,如果是]和),也为no

然后,就是在进行出入栈的操作了。

其实,还可以判断字符长度,如果为奇数也输出no,经过基本的处理,效率会高一些

代码部分:

 1 #include<cstdio> 
 2 #include<string>
 3 #include<iostream>
 4 #include<stack>
 5 using namespace std;
 6 string isOK(string str);
 7 
 8 /*
 9 *平衡括号问题,用栈解决
10 *By hxiaohua 2016-11-03
11 */
12 int main()
13 {
14     string s;
15     cin >> s;
16     if (s.length() == 0)
17         cout << "No\n";
18     else if (s[0] == ']' || s[0] == ')')
19         cout << "No\n";
20     else
21         cout << isOK(s)<<endl;
22     return 0;
23 }
24 
25 string isOK(string str)
26 {
27     stack<char> s0;
28     for (int i = 0; i < str.length(); i++)
29     {
30         if (str[i] == '(' || str[i] == '[')
31             s0.push(str[i]);
32         else if (str[i] == ']')
33         {
34             if (s0.top() == '[')
35                 s0.pop();
36         }
37         else
38         {
39             if (s0.top() == '(')
40                 s0.pop();
41         }
42     }
43     if(s0.empty())
44         return "Yes";
45     else
46         return "No";
47 }

 

posted @ 2016-11-03 11:01  源头活水  阅读(482)  评论(0编辑  收藏  举报