这是最近在ACM练习场上看到的题目:
现在,有一行括号序列,请你检查这行括号是否配对。第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符。每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No。
用栈结构实现最简单,但是一开始我没想到。大体思路如下:
①从输入的每个的字符串的遍历每个字符
②如果遇到 '('或'['就压入栈中,因为如果该字符串匹配的话,这两种字符总是先出现在字符串中
③如果遇到')'或']',就匹配栈顶的元素,如果栈顶元素是对应的'('或者'[',说明匹配,将栈顶元素弹出;如果不匹配,因为这种'([)]'交叉的字符串是不匹配的,直接跳出循环
④重复②③直到遍历完字符串
现在,有一行括号序列,请你检查这行括号是否配对。第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符。每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No。
用栈结构实现最简单,但是一开始我没想到。大体思路如下:
①从输入的每个的字符串的遍历每个字符
②如果遇到 '('或'['就压入栈中,因为如果该字符串匹配的话,这两种字符总是先出现在字符串中
③如果遇到')'或']',就匹配栈顶的元素,如果栈顶元素是对应的'('或者'[',说明匹配,将栈顶元素弹出;如果不匹配,因为这种'([)]'交叉的字符串是不匹配的,直接跳出循环
④重复②③直到遍历完字符串
开始,我用java语言实现,但是测试时间超时,代码如下:`
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
int i; //循环变量
int n; //存储输入的字符串数量
char temp; //临时变量
String string=null;
Stack<Character> stack=new Stack<Character>(); //用于判断字符串是否配对
boolean[] flag; //存储每个是否配对的信息
Scanner scanner=new Scanner(System.in); //接收参数
n=scanner.nextInt(); //接收输入的第一个参数
flag=new boolean[n];
for(i=0;i<n;i++){
//接收输入的字符串
string=scanner.next();
flag[i]=true; //默认为配对
//如果字符串长度为奇数,不能匹配
if(string.length()%2!=0){
flag[i]=false;
continue;
}
//字符串第一个字符为)或]不匹配
if(string.charAt(0)==']'||string.charAt(0)==')'){
flag[i]=false;
continue;
}
for(int j=0;j<string.length();j++){
//字符为( [ 则入栈
temp=string.charAt(j);
if(temp=='['||temp=='('){
stack.push(temp);
}else if(temp==']'){
//如果栈顶元素不能配对,说明不匹配
if(stack.pop()!='['){
flag[i]=false;
stack.clear();
break;
}
}else{
if(stack.pop()!='('){
flag[i]=false;
stack.clear();
break;
}
}
}
}
//控制输出
for(i=0;i<n;i++){
if (flag[i]) {
System.out.println("Yes");
}else {
System.out.println("No");
}
}
}
}
后头我又用c语言实现了一遍,并且对照了大牛的代码,没有发现什么区别,可是我的代码虽然正确,但是运行依然超时,十分不解,有大神帮忙看看么。
#include<stdio.h> #include<stack> #include<string.h> using namespace std; int main() { int n=0; //存储输入的字符串数量 char temp; //临时变量 bool flag; //存储是否为配对的括号 char str[20]; //存储输入的字符串 stack<char> myStack; //用于判断字符串是否配对 int length=0; int number; scanf("%d", &n); while (n--) //循环控制 输入的字符串个数 { flag = true; scanf("%s", &str); length = strlen(str); //如果字符串长度为奇数,不能匹配 if (length % 2 != 0) { printf("No\n"); continue; } //如果第一个字符为] 或) 不匹配 if (str[0] == ']' || str[0] == ')') { printf("No\n"); continue; } else { for (unsigned int j = 0; j< length; j++) { //字符为( [ 则入栈 temp = str[j]; if (temp == '[' || temp == '(') { myStack.push(temp); } else if ((temp == ']') && (myStack.top() != '[') || (temp == ')') && (myStack.top() != '(')) { //如果栈顶元素不能配对,说明不匹配 flag = false; break; } else { myStack.pop(); } } if (flag) { printf("Yes\n"); } else { //清空栈,以便下个字符串使用 while (!myStack.empty()) { myStack.pop(); } printf("No\n"); } } } return 0; }