Java 栈 如何实现括号匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 栈 如何实现括号匹配相关的知识,希望对你有一定的参考价值。

java栈实现括号匹配,主要是使用栈队列算法,如下代码:

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

/**
 * @author Owner
 * 
 */
public class Main 

public static void main(String[] args) 
Scanner sc = new Scanner(System.in);

int n= sc.nextInt();//3条测试数据数据

Stack<Character> stack = null;

while(n!=0)

//从控制台读入一个测试字符串[]() [(])
String str = sc.next();
//如果该输入字符串为奇数,说明不匹配
if(str.length() % 2 == 1)
System.out.println("No");
else
//说明字符是偶数
stack = new Stack<Character>();

//遍历第一条测试字符串[]() [(])
for(int i=0;i<str.length();i++)
if(stack.isEmpty())
//如果栈是空的
stack.push(str.charAt(i));
else if(stack.peek() == \'[\' && str.charAt(i) == \']\' || stack.peek() == \'(\' && str.charAt(i) == \')\')
//说明此时栈中字符不是空的,并且符合,
stack.pop();
else

stack.push(str.charAt(i));



if(stack.isEmpty())
//如果栈是空的,说明括号匹配
System.out.println("Yes");
else
//说明栈不为空,括号不匹配
System.out.println("No");



n--;



参考技术A package ds.linerlist;
import java.util.Stack;
/**
 * 使用栈实现字符串的括号匹配检查。
 * @author <a href="mailto:bao.yiming@live.cn" mce_href="mailto:bao.yiming@live.cn">Bao Yiming</a>
 */
public class BracketMatch 
    /**
     * 进行匹配的算法。
     * @param str 待检查的字符串。
     * @return
     */
    public static boolean match(String str) 
        Stack stack = new Stack(); // 定义一个存放括号的栈。
        char[] ca = str.toCharArray(); // 将字符串转为字符数组以便对其遍历。
        stack.push((Character) ca[0]); // 首先将第一个字符压入栈中。
        /*
         * 从第二个字符开始,依次与栈中字符匹配。
         * 成功则将栈顶元素弹出。
         * 失败则将字符数组中的当前字符压入栈中。
         */
        for (int index = 1; index < ca.length; ++index) 
            Character c1 = (Character) stack.peek();
            Character c2 = ca[index];
            if ((c1.equals('(') && c2.equals(')'))
                    || (c1.equals('[') && c2.equals(']'))) 
                stack.pop();
             else 
                stack.push(c2);
            
        
        return stack.empty();
    

本回答被提问者和网友采纳

括号匹配问题(顺序栈实现)

本周老师作业留了两个。先上传一个吧。那个有时间我再传上来~

本周的要求:

1.给出顺序栈的存储结构定义。
2.完成顺序栈的基本操作函数。
1)      初始化顺序栈
2)      实现入栈和出栈操作
3)      实现取栈顶元素和判空操作
括号匹配问题
3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果。
4.程序调试运行并保存输出结果。
5.整理并提交实验作业。
  1 #include <cstdio>
  2 #include <cstring>
  3 #define Stack_Size 50
  4 
  5 typedef struct 
  6 {
  7     char a[Stack_Size];
  8     int top;
  9 }SeqStack;
 10 
 11 int IsEmpty(SeqStack *S)//栈判空
 12 {
 13     return S->top == -1;
 14 }
 15 
 16 int Match(char ch1,char ch2)//字符串匹配
 17 {
 18     switch(ch2){
 19     case ):
 20         if(ch1==()
 21             return 1;
 22         break;
 23     case }:
 24         if(ch1=={)
 25             return 1;
 26         break;
 27     case ]:
 28         if(ch1==[)
 29             return 1;
 30         break;
 31     }
 32     return 0;
 33 }
 34 
 35 void InitStack(SeqStack * S)//初始化顺序栈
 36 {
 37     S->top = -1;
 38 }
 39 
 40 void Push(SeqStack * S,char x)//进栈
 41 {
 42     S->top++;
 43     S->a[S->top]=x;
 44 }
 45 
 46 void Pop(SeqStack * S,char *x)//出栈
 47 {
 48     *x=S->a[S->top];
 49     S->top--;
 50 }
 51 
 52 void GetTop(SeqStack * S,char *x)
 53 {
 54     *x=S->a[S->top]; 
 55 }
 56 
 57 
 58 void BracketMatch(char *str)
 59 {
 60     SeqStack S;
 61     char ch;
 62     InitStack(&S);
 63     for(int i=0;str[i]!=\0;i++)
 64     {
 65         switch(str[i]){
 66         case (:
 67         case[:
 68         case{:
 69             Push(&S,str[i]);
 70             break;
 71         case ):
 72         case]:
 73         case}:
 74             if(IsEmpty(&S)){
 75                 printf("\n右括号多余!\n");
 76                 return ;
 77             }
 78             else{
 79                 GetTop(&S,&ch);
 80                 if(Match(ch,str[i]))
 81                     Pop(&S,&ch);
 82                 else{
 83                     printf("\n 对应的左右括号不同类!\n");
 84                     return ;
 85                 }
 86             }
 87 
 88         }
 89     }
 90     if(IsEmpty(&S))
 91         printf("\n括号匹配!\n");
 92     else
 93         printf("\n左括号多余!\n");
 94 }
 95 
 96 
 97 int main()
 98 {
 99     char strr[50];
100     printf("请输入各种括号\n");
101     gets(strr);
102     BracketMatch(strr);
103 
104     return 0;
105 }

以上是关于Java 栈 如何实现括号匹配的主要内容,如果未能解决你的问题,请参考以下文章

用栈实现括号匹配的检验

用栈检测括号匹配

Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现

括号匹配问题(顺序栈实现)

20. Valid Parentheses(用栈实现括号匹配)

括号匹配算法