#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. Windows 下 docker 部署 gitlab ci

    一.安装 1. 安装 docker Docker下载 注意:Windows 10 家庭版获取 之前的版本不能直接安装 Docker ,而是需要去安装 Docker Toolbox 我这里安装的是 Do ...

  2. 亚马逊VE账号运营

    VE劲爆内幕大揭秘!“仿牌+Amazon VE”跟卖之路 Amazon Vendor Express 是Amazon.com2015年下旬推出的新的供应商平台,商家通过这个平台可以把产品卖给Amazo ...

  3. SQL添加事务处理

    --modi by lmt declare @errorSum int --记录错误数 begin Create table #CheckreqAccState(CheckReqID varchar( ...

  4. C# FTP操作类的代码

    如下代码是关于C# FTP操作类的代码.using System;using System.Collections.Generic;using System.Text;using System.Net ...

  5. C语言实验一(2)

    #include<stdio.h>int main(){ char c1,c2; c1=97; c2=98; printf("c1=%c,c2=%c\n",c1,c2) ...

  6. iphone上mitmproxy证书设置

    PC端安装mitmproxy并添加证书后,基本问题不大,都能正常运行起来 手机端iphone上下载安装mitmproxy证书: 1.手机和PC在同一个局域网中,设置wifi代理为PC端的ip,端口为m ...

  7. 【数论】卢卡斯定理模板 洛谷P3807

    [数论]卢卡斯定理模板 洛谷P3807 >>>>题目 [题目] https://www.luogu.org/problemnew/show/P3807 [输入格式] 第一行一个 ...

  8. FPM一:简单的road map(GAF)

    首先要有个简单的认识: 1.FPM支持的几种UI配置界面接口: Object Instance Floorplan (OIF) Overview Page Floorplan (OVP) Guided ...

  9. Hive - - 分组求最大,最小(加行键)

    Hive - - 分组求最大,最小(加行键) 数据: 1325927 陕西 汉中 084 08491325928 陕西 汉中 084 08491325930 陕西 延安 084 08421325931 ...

  10. 再次精读《javascript高级程序设计第3版》学习笔记(1)

    第一次拿起这本书是2016年暑假,时隔2年,又一次开始研读这本经典书籍.每次读,都是对之前的一次沉淀和总结,每次都会有新的收获.