平衡的括号[UVA-673]

UVA673 Parentheses Balance

书上习题6-1,题比较简单,主要是使用栈这个“后进先出”的数据结构。因为平衡的括号,必然可以在左半括号进行push而右半括号进行pop,当到达序列末尾而栈不空,显然不满足题意了。

抛开题目说几点内容:一是之前看王爽的《汇编语言》,对栈的pop操作有些误解。在汇编语言中(8086包括现在的IA32、X86-64指令),pop指令有一个操作数,表示将栈顶的元素出栈后所放置的内存单元地址;而在数据结构的栈中,pop操作只是将栈顶元素出栈,直接就丢了。我一开始是用汇编语言的栈去理解,总是以为pop必然可以返回栈顶元素。事实上应该先用top操作去获得栈顶元素,而后用pop弹出栈顶元素。push操作则比较类似了,都带有一个操作数,都表示要压栈的元素。二是本题的描述使用了离散数学课程中的递归定义,[(])显然是不符合这个递归定义的,因为假设[]合法,两个中括号夹着的的A=(必然也需要合法,而实际上只有半个括号,是不合法的,与假设矛盾。除此之外,gets()函数需要考虑之前的空行,不然读入的是包含换行符的空串。

C++实现如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<stack>
 4 #include<cstring>
 5 using namespace std;
 6 int main()
 7 {
 8     stack<char> s;
 9     char buf[200];
10     int cases;
11     cin >> cases;
12     getchar();
13     while (1)
14     {
15     RESTART:
16         if (!cases--)
17             break;
18         while (!s.empty())
19             s.pop();
20         gets(buf);
21         if (strcmp(buf, "\n") == 0)
22         {
23             printf("Yes\n");
24             continue;
25         }
26         for (int i = 0; buf[i] != 0; i++)
27         {
28             switch (buf[i])
29             {
30                 case ‘(‘:
31                 case ‘[‘:
32                     s.push(buf[i]);
33                     break;
34                 case ‘)‘:
35                     if (s.empty() || s.top() != ‘(‘)
36                     {
37                         printf("No\n");
38                         goto RESTART;
39                     }
40                     else
41                         s.pop();
42                     break;
43                 case ‘]‘:
44                     if (s.empty() || s.top() != ‘[‘)
45                     {
46                         printf("No\n");
47                         goto RESTART;
48                     }
49                     else
50                         s.pop();
51                     break;
52             }
53         }
54         if (s.empty())
55             printf("Yes\n");
56         else
57             printf("No\n");
58     }
59     return 0;
60 }
时间: 2024-08-08 09:41:26

平衡的括号[UVA-673]的相关文章

UVa 673 括号平衡

思路:简单的匹配操作,利用栈. Code: #include<stdio.h> #include<string.h> char stack[135]; int main() { int n; scanf("%d",&n); getchar(); while(n-->0) { memset(stack,0,sizeof(stack)); char c; int top=0; int flag=1; while((c=getchar())!='\n')

UVA 673(括号匹配)

本地单文件上传脚本,命名uf 这是在本机上做的测试,利用bpcs_uploader脚本实现,只是进行简单的封装,自动完善云端文件路径. 技术要点:使用dirname获取文件所在目录,使用pwd获取文件完整路径,并作为云端文件路径. #!/bin/bash cur_dir=$(cd "$(dirname "$1")"; pwd) name=$(basename "$1") /home/grm/bin/bpcs_uploader/bpcs_uploa

UVA - 673 - Parentheses Balance (栈的应用!)

UVA - 673 Parentheses Balance Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description  Parentheses Balance  You are given a string consisting of parentheses () and []. A string of this type is said to be co

uva673_平衡的括号(网上写的好麻烦。。)

/////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:tt2767 声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 查看本文更新与讨论请点击:http://blog.csdn.net/tt2767 链接被删请百度: CSDN tt2767 ///////////////

UVa 673 平衡的括号

题意:给出包含"()"和"[]"的括号序列,判断是否合法. 用栈来完成,注意空串就行. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<stack> 5 using namespace std; 6 7 stack<char> sta; 8 string s; 9 10 int solve() 11 { 12 ch

UVa 673 Parentheses Balance(括号配对 栈)

题意  判断输入的括号序列是否是配对的 栈的基础应用  栈顶元素与输入的字符匹配就出栈咯  注意括号序列可以为空 STL栈 #include <bits/stdc++.h> using namespace std; int main() { int cas; char c; cin >> cas; getchar(); while(cas--) { stack<char> s; while((c = getchar()) != '\n') { if(s.empty())

UVa 673 (括号配对) Parentheses Balance

本来是当做水题来做的,后来发现这道题略坑. 首先输入的字符串可能是空串,所以我用了gets函数,紧接着就被scanf("%d", &n)后面的换行符坑掉了. 于是乎再加一句getchar() 1 #include <cstdio> 2 #include <stack> 3 #include <cstring> 4 using namespace std; 5 6 const int maxn = 150; 7 char s[maxn]; 8

uva 673括号匹配问题

注意:空行要输出Yes,要用gets读函数,这道题让我学会了gets和scanf函数除了空格问题之外还是 有区别的,scanf把空格,Tab, 回车都视为结束标志,不会读入他们,后面自动加'\0',所以空格,回车,Tab 都在缓冲区,可以用getchar()读取到,但是gets()函数虽然也将回车视为结束标志,但是他们会将回车读 入,读到字符串里是'\0',所以,他们就不会存在缓冲区里,也就是说用getchar()读取不到他们了... 放代码: #include<stdio.h> #inclu

uva 673 Parentheses Balance

Parentheses Balance You are given a string consisting of parentheses () and []. A string of this type is said to be correct: (a)if it is the empty string (b)if A and B are correct, AB is correct, (c)if A is correct, (A) and [A] is correct. Write a pr