实验任务
小光头解开了老鼠的难题,老鼠很高兴,告诉他们,他们需要打败控制这个森林的大魔王才能走出这片森林。如果小光头能再帮他解开一个难题,他就告诉小光头去哪里找这个大魔王。
问题是这样的,老鼠给了一串由由(,),[,],{,},<,>构成的一个括号字符串,判断这个字符串左右括号是否匹配。
数据输入
输入包括多组数据,每组数据只有一行括号字符串,其长度不大于 10000。
数据输出
对于每组数据,若匹配则输出“Yes“,否则输出“No”。
输入示例
[()()]][]
[(])
([])
输出示例
No
No
Yes
解题思路
栈的简单运用,如果当前括号与栈顶中的括号相匹配,则栈顶括号出栈,否则当前括号入栈。若最终是空栈,则说明所有括号都是匹配的。
参考代码
C版本:
#include <stdio.h>
#include <string.h>
#define maxn 10010
typedef struct{
char data[maxn];
int top;
}stack;
stack st, *s=&st;
char m[128],str[maxn];
void Push(char c){s->top ++;s->data[s->top] = c;}
void Pop(){s->top--;}
char Top(){return s->data[s->top];}
int main()
{
m[')'] = '(',m[']'] = '[';
m['}'] = '{',m['>'] = '<';
while (scanf("%s",str) != EOF){
Push('#');
int len = strlen(str);
for (int i = 0;i < len;i++){
if (m[str[i]] == Top())
Pop();
else
Push(str[i]);
}
printf("%s\n",(Top() == '#')?"Yes":"No");
}
return 0;
}
C++版本
#include <iostream>
#include <string>
#include <map>
#include <stack>
using namespace std;
map<char,char> m; //映射
int main()
{
m[')'] = '(',m[']'] = '[';
m['}'] = '{',m['>'] = '<';
string str;
while(cin >> str){
stack<char> s;
s.push('#');
for (int i = 0;i < str.size();i++){
if(m[str[i]] == s.top())
s.pop();
else
s.push(str[i]);
}
printf("%s\n",(s.top() == '#')?"Yes":"No");
}
return 0;
}