在Go(Golang)中检查小括号有效性的程序

337 阅读1分钟

概述

有一个输入字符串,只包含以下字符

  • (

  • )

  • {

  • }

  • [

  • ]

其目的是检查输入的字符串是否有有效的小括号。一个小括号是有效的,如果

  • 打开的小括号应该以相同的顺序关闭。意味着下面的括号将是无效的,因为括号没有按照正确的顺序关闭

([)]

  • 每个开放的括号都应该有相应的封闭括号

有效括号的例子

()
{}
[]
()[]
([{}])
()[{}]

无效小括号示例

([)]
(
{
[
(()

程序

我们的想法是使用一个堆栈

  • 如果给定的小括号是左小括号,我们就把它推到堆栈里。

  • 如果给定的括号是右括号,我们从堆栈中弹出,并检查弹出的左括号是否与当前的右括号对应。例如,如果我们在字符串中遇到**']',我们就弹出并检查弹出的值是否只是'['。如果它不是,我们就返回false。对于')'** 和 **'}'**也是如此。

  • 在字符串的最后,堆栈应该是空的。

下面是相同的程序。

package main

import (
	"container/list"
	"fmt"
)

func main() {
	valid := isValid("()")
	fmt.Println(valid)

	valid = isValid("[]")
	fmt.Println(valid)

	valid = isValid("{}")
	fmt.Println(valid)

	valid = isValid("()[]")
	fmt.Println(valid)

	valid = isValid("([{}])")
	fmt.Println(valid)

	valid = isValid("()[{}]")
	fmt.Println(valid)

	valid = isValid("([)]")
	fmt.Println(valid)

	valid = isValid("(")
	fmt.Println(valid)

	valid = isValid("(()")
	fmt.Println(valid)

}

type customStack struct {
	stack *list.List
}

func (c *customStack) Push(value string) {
	c.stack.PushFront(value)
}

func (c *customStack) Pop() error {
	if c.stack.Len() > 0 {
		ele := c.stack.Front()
		c.stack.Remove(ele)
	}
	return fmt.Errorf("Pop Error: Stack is empty")
}

func (c *customStack) Front() (string, error) {
	if c.stack.Len() > 0 {
		if val, ok := c.stack.Front().Value.(string); ok {
			return val, nil
		}
		return "", fmt.Errorf("Peep Error: Stack Datatype is incorrect")
	}
	return "", fmt.Errorf("Peep Error: Stack is empty")
}

func (c *customStack) Size() int {
	return c.stack.Len()
}

func (c *customStack) Empty() bool {
	return c.stack.Len() == 0
}

func isValid(s string) bool {
	customStack := &customStack{
		stack: list.New(),
	}

	for _, val := range s {

		if val == '(' || val == '[' || val == '{' {
			customStack.Push(string(val))
		} else if val == ')' {
			poppedValue, _ := customStack.Front()
			if poppedValue != "(" {
				return false
			}
			customStack.Pop()
		} else if val == ']' {
			poppedValue, _ := customStack.Front()
			if poppedValue != "[" {
				return false
			}
			customStack.Pop()

		} else if val == '}' {
			poppedValue, _ := customStack.Front()
			if poppedValue != "{" {
				return false
			}
			customStack.Pop()

		}

	}

	return customStack.Size() == 0
}

输出

true
true
true
true
true
true
false
false
false