匹配括号

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ValidParentheses
{

   // 如果不存在星号,我们甚至连stack都可以不用,直接用一个变量,遇到左括号,自增1,遇到右括号,如果变量为0,直接返回false,否则自减1
   //最后只要看变量是否为0即可。
    class Program
    {
        public class Node
        {
            public string val;
            public Node Next;
            public Node(string s)
            {
                val = s;
            }
        }
        public class Stack
        {
            public Node Top;
            public void PushIn(Node nd)
            {
                if (Top != null)
                {
                    Node temp = Top;
                    Top = nd;
                    Top.Next = temp;
                }
                else
                {
                    Top = nd;
                    Top.Next = null;
                }
            }
            public Node PopOut()
            {
                Node nd = null;
                if (Top != null)
                {
                    nd.val = Top.val;
                    Top = Top.Next;
                }
                return nd;
            }
        }

        public static void Match(string s, ref Stack A, ref Stack B)
        {
            //取元素,如果是左括号压入栈A中。如果是右括号,将元素放入栈B中,直到取到与之匹配的左括号,如果A空之后,右括号还没有找到,将AB互换。但是找到了,将B的元素压入A中。

            if (s == "(" || s == "[" || s == "{")
            {
                A.PushIn(new Node(s));

            }
            else if (s == ")" || s == "]" || s == "}")
            {

                while (A.Top != null)
                {
                    Node temp = A.PopOut();
                    if (temp.val == "(" && s == ")" || temp.val == "[" && s == "]" || temp.val == "{" && s == "}")
                    {
                        s = string.Empty;
                        break;
                    }
                    else
                    {
                        B.PushIn(temp);
                    }
                }
                if (s != string.Empty)
                {
                    B.PushIn(new Node(s));
                }
                if (A.Top == null)
                {
                    Stack st = A;
                    A = B;
                    B = st;
                }
                else
                {
                    while (B.Top != null)
                    {
                        A.PushIn(B.PopOut());
                    }
                }

            }
        }
        static void Main(string[] args)
        {
            string[] slist = { "a","(","[","+","}",")","]"};
            Stack A = new Stack();
            Stack B = new Stack();
            for (int i = 0; i < slist.Length; i++)
            {
               Match(slist[i],ref A,ref B);              
            }
            while (A.Top != null)
            {
                Console.Write(A.Top.val+" ");
                A.Top = A.Top.Next;
            }
            Console.ReadKey();
        }
    }
}

 

posted @ 2017-11-02 17:25  美美美少女  阅读(213)  评论(0编辑  收藏  举报