首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以最好的方式检查算术字符串括号中的symmerty

以最好的方式检查算术字符串括号中的symmerty
EN

Stack Overflow用户
提问于 2016-04-08 06:23:42
回答 2查看 600关注 0票数 1

我想检查给定的字符串是否如下所示:

代码语言:javascript
复制
(a[i]+{-1}*(8-9))

是有效的

有效方法:

代码语言:javascript
复制
([]{}()) 

这是可以的,无效的是:

代码语言:javascript
复制
{([[}))

我正在尝试通过stacks来实现这一点。

首先,堆栈提取这3个括号中的任意一个,并反向推送它。第二个堆栈再次推送它,所以如果我有:

代码语言:javascript
复制
(   [   ]   {   }   (   )   )

第一个堆栈获取:

代码语言:javascript
复制
)   ]   }   )

第二个堆栈获取:

代码语言:javascript
复制
)   }   ]   )

现在是逻辑部分。

我找到了一个非常丑陋的解决方案。理想是什么?(请不要让我发布我的解决方案,因为它是有效的,但它只是凌乱和糟糕的,远离“理想”)

不管怎样,这是我的算术字符串和2个堆栈:

代码语言:javascript
复制
    public static string aritmethic { get; } = "( a[i]+{-1}*(8-9) )";
    Stack<char> original = new Stack<char>();
    Stack<char> temp = new Stack<char>();

下面是第一个堆栈反向推送:

代码语言:javascript
复制
    public void PushToOriginal()
    {
        for (int i = 0; i < aritmethic.Length; i++)
        {
            if ((aritmethic[i] == '{'))
            {
                original.Push('}');
            }
            else if (aritmethic[i] == '[')
            {
                original.Push(']');
            }
            else if (aritmethic[i] == '(')
            {
                original.Push(')');
            }
        }
    }

第二次堆栈推送:

代码语言:javascript
复制
    public void PushToTemp()
    {
        for (int i = 0; i < original.Count; i++)
        {
            temp.Push(original.Pop());
        }
    }

现在我需要一个合理的逻辑:

代码语言:javascript
复制
    public void Checker()
    {
        //Logic here 
        /*
        if (temp.Peek() == ....) 
        temp.Pop();
        *May cause an error  
        */
            if (temp.Count == 0)
                Console.WriteLine("Aritmethic Matches!");
            else
                Console.WriteLine("Aritmethic does not Match!!");
        }
    }

希望我的问题说得够清楚了。谢谢!顺便说一句,我对CSharp真的很陌生,所以对我来说不要苛刻!

EN

回答 2

Stack Overflow用户

发布于 2016-04-08 06:34:49

您可以非常简单地使用单个堆栈和通过输入字符串的单个遍来完成所有这些操作:

代码语言:javascript
复制
var openers = "([{";
var closers = ")]}";
var brackets = new Stack<char>();
for (int i = 0; i != s.Length; ++i) {
    if (openers.Contains(s[i]))
        brackets.Push(s[i]);
    else if (closers.Contains(s[i])) {
        var opener = openers[closers.IndexOf(s[i])];
        if (brackets.Count == 0 || brackets.Peek() != opener)
            Console.WriteLine("Mismatched '{0}' at {1}", s[i], i);
        else
            brackets.Pop();
    }
}
if (brackets.Count != 0)
    Console.WriteLine("Unmatched '{0}'", brackets.Peek());

这之所以有效,是因为当您遇到左方括号时,您期望的下一件事就是匹配的右方括号(或创建嵌套范围的另一个左方括号)。因此,对于每个左括号,代码都会将一个新状态推送到堆栈上,当遇到右括号时,它会弹出该状态(检查它们是否匹配)。

票数 3
EN

Stack Overflow用户

发布于 2016-04-08 06:40:21

代码语言:javascript
复制
static void Main(String[] args)
{
    string input = "{()}";
    bool success = true;
    HashSet<char> openBrackets = new HashSet<char>() { '(', '{', '[' };
    HashSet<char> closeBrackets = new HashSet<char>() { ')', '}', ']' };
    Stack<char> mystack = new Stack<char>();
    for (int i = 0; i < input.Length; i++)
    {
        if (openBrackets.Contains(input[i]))
            mystack.Push(input[i]);
        else if (closeBrackets.Contains(input[i])){
            if(mystack.Count == 0)
            {
                success = false;
                break;
            }
            if (input[i] == '}' && mystack.Peek() == '{')
                    mystack.Pop();
            else if (input[i] == ')' && mystack.Peek() == '(')
                    mystack.Pop();
            else if (input[i] == ']' && mystack.Peek() == '[')
                    mystack.Pop();
            else
            {
                success = false;
                break;
            }
        }


    }

    if (mystack.Count == 0 && success)
        Console.WriteLine("Correct Input");
    else Console.WriteLine("Incorrect input");

    Console.ReadKey();
}

算法: 1.创建一个新的堆栈!!2.当你遇到左方括号时,将它推送到堆栈上。3.当你遇到结束括号时,检查堆栈顶部的当前元素是结束括号的对应括号。如果是,则弹出堆栈的顶部元素。4.最后检查堆栈中的其余元素是否为零!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36488260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档