- 描述
现在,有一行括号序列,请你检查这行括号是否配对。 - 输入
第一行输入一个数N,表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]”,”(“,”)”四种字符 输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No算法思想:
括号匹配是数据结构——栈的一个简单运用。
首先对输入字符串从左到右进行扫描,如果扫描到的是左括号“(”、”]“,则将其入栈;
如果扫描到的是右括号“)”、“]”,则查找栈顶元素是否是与之匹配的左括号。
如果是,则将栈顶元素弹出,继续扫描字符串的下一个字符;
如果不是或者栈为空,则表明没有与之对应的左括号,终止扫描,跳出循环。
最后,判断栈是否为空且字符串是否已经扫描到末尾’\0’,
如果两者都成立,则表明括号匹配成功;
否则,表明括号匹配失败。源代码(栈的所有操作附加上,所以代码有点冗余,其中栈是用C语言写的,故在头文件上加入了
#include <iostream>
#include <cstdlib>
#include <string>
#include <stdio.h>
using namespace std;
#define true 1
#define false 0
typedef struct Node{
char data;
struct Node *pNext;
}NODE,*PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
}STACK, *PSTACK;
void init(PSTACK pS);
void push(PSTACK pS, int val);
void traverse(PSTACK pS);
int pop(PSTACK pS, int *val);
void clear(PSTACK pS);
int empty(PSTACK pS);
//栈的初始化
void init(PSTACK pS)
{
pS->pTop = (PNODE)malloc(sizeof(NODE));
if (NULL == pS->pTop)
{
printf("动态内存分配失败!");
exit(-1);
}
else
{
pS->pBottom = pS->pTop;
pS->pTop->pNext = NULL;
}
return;
}
//插入元素到栈顶
void push(PSTACK pS, char val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
return;
}
//遍历栈S
void traverse(PSTACK pS)
{
PNODE p = pS->pTop;
printf("栈内元素为:");
while (p != pS->pBottom)
{
printf("%c\t", p->data);
p = p->pNext;
}
printf("\n");
return;
}
//判断栈是否为空
int empty(PSTACK pS)
{
if (pS->pTop == pS->pBottom)
{
return true;
}
else
return false;
}
//删除栈顶元素并将其值赋给*val
int pop(PSTACK pS, char *val)
{
if (empty(pS))
{
return false;
}
else
{
PNODE r = pS->pTop;
*val = r->data;
pS->pTop = r->pNext;
free(r);
r = NULL;
}
return 0;
}
//获取栈顶元素
int gettop(PSTACK pS)
{
if (empty(pS))
{
return false;
}
else
{
PNODE r = pS->pTop;
return (r->data);
}
}
//清空栈S
void clear(PSTACK pS)
{
if (empty(pS))
{
return;
}
else
{
PNODE p = pS->pTop;
PNODE q = NULL;
while (p != pS->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
return;
}
}
int main()
{
int N;
string str;
STACK s;
char ch;
cin >> N;
init(&s);
while (N--)
{
int i;
clear(&s);
cin >> str;
for ( i = 0; str[i] != '\0'; i++)
{
if (str[i] == '[' || str[i] == '(')
{
push(&s,str[i]);
}
else if (str[i] == ']' && gettop(&s) == '[')
{
pop(&s,&ch);
}
else if (str[i] == ')' && gettop(&s) == '(')
{
pop(&s, &ch);
}
else
{
break;
}
}
if (str[i] == '\0' && empty(&s))
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}
- 心得
程序很简单,调试的时候挺二货的,本地调试成功,测试也成功,提交就出现Wrong answer。仔细查看题目,发现原来是输出大小写没注意。浪费了十几分钟!!!