zoukankan      html  css  js  c++  java
  • 算法:括号匹配问题

      给定一个表达式字符串 exp,编写一个程序来检查 exp 中 “ {”,“}”,“(”,”)”,“ [”,“]” 这三个括号对在完整性和顺序上是否正确。

    输入:exp = “[()]{}{[()()]()}”
    输出:平衡
    
    输入:exp = “[(])”
    输出:不平衡

    算法:

    • 声明一个字符堆栈 S。
    • 现在遍历表达式字符串exp。
      1. 如果当前字符是一个起始括号('('或'{'或'['),则将其压入堆栈。
      2. 如果当前字符是右括号(')'或'}'或']'),则从堆栈中弹出,如果弹出的字符是匹配的起始括号,则否括号不平衡。
    • 完全遍历后,如果堆栈中还有一些起始括号,则“不平衡”。

    算法时间复杂度为 O(n),n 为表达式长度;使用了一个空间为 x 的堆栈,空间复杂度为 O(x)。

      1 package algorithm;
      2 
      3 /**
      4  * 括号匹配问题(Check for balanced parentheses)
      5  */
      6 public class BalancedParen {
      7     /**
      8      * 存放括号(左半部分)的栈
      9      */
     10     static class Stack {
     11         int top = -1;
     12         char[] items = new char[100];
     13 
     14         /**
     15          * 入栈
     16          *
     17          * @param x
     18          */
     19         void push(char x) {
     20             if (top == 99)
     21                 System.err.println("Stack full");
     22             else
     23                 items[++top] = x;
     24         }
     25 
     26         /**
     27          * 出栈
     28          *
     29          * @return
     30          */
     31         char pop() {
     32             if (top == -1) {
     33                 System.err.println("Underflow error");
     34                 return '';
     35             } else {
     36                 char element = items[top];
     37                 top--;
     38                 return element;
     39             }
     40         }
     41 
     42         /**
     43          * 判空
     44          *
     45          * @return
     46          */
     47         boolean isEmpty() {
     48             return top == -1;
     49         }
     50     }
     51 
     52     /**
     53      * 检查括号是否成对
     54      *
     55      * @param character1 左半部分
     56      * @param character2 右半部分
     57      * @return
     58      */
     59     private static boolean isMatchingPair(char character1, char character2) {
     60         if (character1 == '(' && character2 == ')')
     61             return true;
     62         else if (character1 == '{' && character2 == '}')
     63             return true;
     64         else
     65             return character1 == '[' && character2 == ']';
     66     }
     67 
     68     /**
     69      * 检查括号是否平衡
     70      *
     71      * @param exp 表达式
     72      * @return
     73      */
     74     private static boolean areParenthesisBalanced(char[] exp) {
     75         Stack st = new Stack();
     76         for (char c : exp) {
     77             // 把括号的左边部分压入栈中
     78             if (c == '{' || c == '(' || c == '[') {
     79                 st.push(c);
     80             }
     81 
     82             // 当在表达式遇到括号的右半部分时,与栈中最近匹配到的(栈顶)括号类型是否相同
     83             if (c == '}' || c == ')' || c == ']') {
     84                 if (st.isEmpty()) {
     85                     return false;
     86                 } else if (!isMatchingPair(st.pop(), c)) {
     87                     return false;
     88                 }
     89             }
     90         }
     91 
     92         return st.isEmpty(); // 若栈中还有括号存在,则表达式中缺相应括号的右半部分
     93     }
     94 
     95     public static void main(String[] args) {
     96         char[] exp = {'{', '(', ')', '}', '[', ']'};
     97         if (areParenthesisBalanced(exp))
     98             System.out.println("Balanced");
     99         else
    100             System.out.println("Not Balanced");
    101     }
    102 }
  • 相关阅读:
    常忘知识点一:嵌套属性
    button按钮的状态为disabled禁用状态,click事件无法触发,但是为什么touchstart下却依然可以触发
    shell
    sql help cs
    再次写给我们这些浮躁的程序员
    C# winform进度条 (异步)
    关于C# WinForm中进度条的实现方法
    Oracle 多行记录合并/连接/聚合字符串的几种方法
    PL/SQL编码规范的一些建议
    PL/SQL 日期时间类型函数及运算
  • 原文地址:https://www.cnblogs.com/magic-sea/p/12056728.html
Copyright © 2011-2022 走看看