括号闭合问题PHP版

写一个函数,判断扩号是否闭合,左右对称即为闭合,如:((())))(())(())))(((((())(()())()()

答案

使用PHP的array_pop()和array_push()模拟一个栈,

  • 遇到左括号进栈
  • 遇到右括号出栈,如果栈里没有,说明不闭合
  • 遍历到最后元素,判断栈内为空,即为闭合
  1. function checkClose($str)
  2. {
  3. $stack = [];
  4. for ($i = 0; $i < strlen($str); ++$i) {
  5. if ($str[$i] == '(') {
  6. $stack[] = '(';
  7. }
  8. if ($str[$i] == ')') {
  9. $border = array_pop($stack);
  10. if($border == null) {
  11. return false;
  12. }
  13. }
  14. }
  15. if (count($stack) == 0) {
  16. return true;
  17. }
  18. return false;
  19. }

测试代码:

  1. var_dump(checkClose('(())')); // bool(true)
  2. var_dump(checkClose('(())()((')); // bool(false)
  3. var_dump(checkClose('(())()()')); // bool(true)
  4. var_dump(checkClose('(())()))')); // bool(false)
  5. var_dump(checkClose('(5+2)*6/(3-1)')); // bool(true)