#include<bits/stdc++.h>
using namespace std; #define STACK_INIT_SIZE 10000
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
using namespace std;
typedef char SElemType, Status;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{
S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if (!S.base)
exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &S, SElemType e)
{
if (S.top - S.base >= S.stacksize)
{
S.base = (SElemType*)malloc(sizeof(SElemType)*(S.stacksize + STACKINCREMENT));
if (!S.base)
exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK; }
Status Pop(SqStack &S)
{
if (S.top == S.base)
return ERROR;
S.top--;
return OK;
}
Status GetTop(SqStack &S, SElemType &e)
{
if (S.base == S.top)
return ERROR;
e = *(S.top - );
return OK;
}
Status Empty(SqStack S)
{
if (S.top == S.base)
return OK;
else
return ERROR;
} const int maxn = + ;
char s[maxn];
bool Find(SqStack &S, char ch)
{
char tmp[maxn]; //初始化为“\n”;
memset(tmp, '\n', sizeof(tmp)); //Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
int num = ;
while (!Empty)
{
SElemType e2;
GetTop(S, e2);
if (e2 == ch)
{
Pop(S);
for (int i = num - ; i >= ; i--)
Push(S, tmp[i]);
return true;
}
else
{
tmp[num++] = e2;
}
Pop(S);
}
for (int i = num - ; i >= ; i--)
Push(S, tmp[i]);
return false;
}
void judge(char ch)
{
if (ch == '(')
printf("(-?\n");
else if (ch == '[')
printf("[-?\n");
else if (ch == '{')
printf("{-?\n");
else if (ch == '<')
printf("/*-?\n");
} void fun(SqStack &Sta, char ch)
{
int flag = ;;
if (!Empty(S)
{
SElemType e;
GetTop(Sta, e);
if (e == '(')
Pop(Sta);
else if (flag)
{
printf("NO\n");
flag = ;
judge(e);
}
}
} int main()
{
SqStack Sta;
InitStack(Sta);
int flag = ;
while (gets(s))
{
if (s[] == '.') break;
int len = strlen(s);
for (int i = ; i < len; i++)
{
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
Push(Sta, s[i]);
else if (s[i] == '/'&&s[i + ] == '*'&&i + < len)
{
++i;
Push(Sta, '<');
} else if (s[i] == ')')
{ if (!Empty(Sta)
{
SElemType e;
GetTop(Sta, e);
if (e == '(')
Pop(Sta);
else if (flag)
{
printf("NO\n");
flag = ;
judge(e);
}
}
else if (flag)
{
flag = ;
printf("NO\n");
printf("?-)\n");
} }
else if (s[i] == ']')
{ if (!Empty(Sta)
{
SElemType e;
GetTop(Sta, e);
if (e == '[')
Pop(Sta);
else if (flag)
{
printf("NO\n");
flag = ;
judge(e);
}
}
else if (flag)
{
flag = ;
printf("NO\n");
printf("?-]\n");
} }
else if (s[i] == '}')
{ if (!Empty(Sta)
{
SElemType e;
GetTop(Sta, e);
if (e == '{')
Pop(Sta);
else if (flag)
{
printf("NO\n");
flag = ;
judge(e);
}
}
else if (flag)
{
flag = ;
printf("NO\n");
printf("?-}\n");
} }
else if (s[i] == '*'&&s[i + ] == '/'&&i + < len)
{
++i;
if (!Empty(Sta)
{
SElemType e;
GetTop(Sta, e);
if (e == '<')
Pop(Sta);
else if (flag)
{
printf("NO\n");
flag = ;
judge(e);
}
}
else if (flag)
{
flag = ;
printf("NO\n");
printf("?-*/\n");
} }
}
}
if (flag)
{
if (!Empty(Sta)
printf("YES\n");
else
{
SElemType e;
GetTop(Sta, e);
printf("NO\n");
judge(e);
}
}
}
7-2 符号配对 (20 分)

请编写程序检查C语言源程序中下列符号是否配对:/**/()[]{}

输入格式:

输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

输出格式:

首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?

输入样例1:

void test()
{
int i, A[10];
for (i=0; i<10; i++) /*/
A[i] = i;
}
.

输出样例1:

NO
/*-?

输入样例2:

void test()
{
int i, A[10];
for (i=0; i<10; i++) /**/
A[i] = i;
}]
.

输出样例2:

NO
?-]

输入样例3:

void test()
{
int i
double A[10];
for (i=0; i<10; i++) /**/
A[i] = 0.1*i;
}
.

输出样例3:

YES

PTA-栈(括弧匹配)的更多相关文章

  1. 括弧匹配检验(check)

    /*题目:括弧匹配检验 检验给定表达式中括弧是否正确匹配 (两种括弧“( ) ”“[]" ,正确输出OK,错误则输出wrong. 2016年8月8日07:24:58 作者:冰樱梦 */ # ...

  2. leetcode 栈 括号匹配

    https://oj.leetcode.com/problems/valid-parentheses/ 遇到左括号入栈,遇到右括号出栈找匹配,为空或不匹配为空, public class Soluti ...

  3. 第六周PTA笔记 括号匹配调整+堆放石子+最大积分+168

    括号匹配调整 如果通过插入" +"和" 1"可以从中得到格式正确的数学表达式,则将带括号的序列称为正确的. 例如,序列 "(())()",& ...

  4. 括弧匹配检验(check.cpp)

    [问题描述]        假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错 ...

  5. 1354:括弧匹配检验ybt

    [题目描述]假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配. 现在 ...

  6. CF 990C. Bracket Sequences Concatenation Problem【栈/括号匹配】

    [链接]:CF [题意]: 给出n个字符串,保证只包含'('和')',求从中取2个字符串链接后形成正确的括号序列的方案数(每个串都可以重复使用)(像'()()'和'(())'这样的都是合法的,像')( ...

  7. ACM/ICPC 之 用双向链表 or 模拟栈 解“栈混洗”问题-火车调度(TSH OJ - Train)

    本篇用双向链表和模拟栈混洗过程两种解答方式具体解答“栈混洗”的应用问题 有关栈混洗的定义和解释在此篇:手记-栈与队列相关 列车调度(Train) 描述 某列车调度站的铁道联接结构如Figure 1所示 ...

  8. 栈应用之中缀表达式计算 MFC实现(计算器核心)

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 支持小数.阶乘.乘方.加减乘除.括号优先级运算,美化输出结果(显示结果末尾没有多余的0) void ...

  9. 带问号的括号匹配问题918C 1153C

    cf里好像经常出 这些题,一般贪心是搞不了的.. 918C 问有多少子段[l,r]满足合法括号 先从左往右扫,如果问号+‘(' 数量 >= ')' 说明这段区间的 ) 是满足条件的 然后再从右往 ...

随机推荐

  1. Win10提示“因为文件共享不安全,所以你不能连接到文件共享”如何处理

    在使用Windows10 1803版本系统连接CentOS6.5下搭建的Samba服务时,发现打开共享文件会遇到以下提示: 其实,该问题是Win10版本不兼容导致的.微软官方说明:https://go ...

  2. Eclipse下运行maven项目失败且Tomcat服务器也启动不了

    今天遇到一个神奇的问题,在eclipse中创建一个maven项目后,Run on server 时说服务器启动失败.我以为是Eclipse配置tomcat的问题.找了一大堆没找到想要的答案!!! 我还 ...

  3. 11-类中的__call__函数

    __call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 举例: >>>class Reader(): def __ini ...

  4. Oracle高级查询之over(partition by...)

    现有表,数据如下: eg1:查询年龄第二的队员 通常写法: select * from (select a.*, rownum r from (select t.* from l_student_in ...

  5. python 读取excel文件

    方法一:利用pandas import pandas as pd inputfile_1 = "F:\\大论文实验\\福贡县数据\\贫困人口数据_2015.xlsx" data1 ...

  6. 合并多个Excel

    合并excel分为两种情况:1.将多个excel文件合并在一个excel中的不同sheet中.2.将多个excel文件合并在一个excel文件的一个sheet中. 1.将多个excel的文件合并在一个 ...

  7. Azkaban启动web--javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at sun.se

    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at sun.se javax.net.ssl. ...

  8. 在Ubuntu 18.04 安装 MySQL 8.0

    在Ubuntu 18.04 安装 MySQL 8.0 ① 登入 mysql 官网,在官网中下载 deb 包,点击该链接,即可下载. https://dev.mysql.com/downloads/re ...

  9. js的关于for的语句

    JavaScript for...in 语句 for...in 语句用于对数组或者对象的属性进行循环操作. for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作. ...

  10. 《用Python写爬虫》学习笔记(二)编写第一个网络爬虫

    1.首先,下载网页使用Python的urllib2模块,或者Python HTTP模块request来实现 urllib2会出现问题,解决方法1.重试下载(设置下载次数) 2.设置用户代理 2.其次, ...