括号匹配问题

实现一:

import java.util.Scanner;
import java.util.Stack;

/*括号匹配
 * 
括号配对问题
时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])样例输出
No
No
Yes

解题思路:
利用栈来操作
一,将输入的数据当做字符串来接收
二。从头开始判断,如果是左边的括号就压入栈中,如果是右边的括号就弹出栈中的一个元素看两个括号
是否匹配,如果匹配则继续,如果不匹配则返回错误,一直到栈中没有元素,同时字符串也遍历完毕时,
返回成功,否则(字符串未遍历完,出现右括号,但是栈中没有元素,失败,栈中还有元素但是字符串还
没有遍历完,失败)返回失败

 * */
public class KuoHaoPiPei {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO 自动生成方法存根

  Scanner sc=new Scanner(System.in);
  int n=sc.nextInt();
  sc.nextLine();
  for(int i=0;i<n;i++)
  {
   String s=sc.nextLine().trim();
   panDuan(s);
  }
 }
 
 //判断字符串S中的括号是否匹配
 public static void  panDuan(String s)
 {
  Stack st=new Stack();
  int len=s.length();
  for(int i=0;i<len;i++)
  {
   String c=s.charAt(i)+"";
   if(c.equals("(")||c.equals("["))
    st.push(c);
   else //右边括号
   {
    if(st.isEmpty())
    {
     System.out.println("No");
     return;
    }
    else
    {
     if(c.equals(")"))
     {
      String s2=(String)st.pop();
      if(!s2.equals("("))
      {
       System.out.println("No");
       return;
      }
       
     }
     else
     {
      String s2=(String)st.pop();
      if(!s2.equals("["))
      {
       System.out.println("No");
       return;
      }
     }
    }
   }
   
  }
  if(st.isEmpty())
   System.out.println("Yes");
  else
   System.out.println("No");
 }

}

运行结果:时间 115  内存 1639   语言Java

最优代码:#include 03.#include 04.#include 05.using namespace std; 06.int main() 07.{ 08. int n; 09. cin>>n; 10. while(n--) 11. { 12. vector vec; 13. string ch; 14. vec.push_back(' '); 15. cin>>ch; 16. for(int i=0;i<ch.length();i++) 17. { 18. vec.push_back(ch[i]); 19. if( vec.back()-1 == *(vec.end()-2) || vec.back()-2 == *(vec.end()-2)) 20. { 21. vec.pop_back(); 22. vec.pop_back(); 23. } 24. } 25. if(vec.size()==1) 26. cout<<"Yes"<<endl; 27. else28. cout<<"No"<<endl; 29. } 30. return 0; 31.}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值