public string ReversePostfix()
        {
            string             postfix = null;
            ConnectedListStack mstack  = new ConnectedListStack();

            foreach (char cur in data)
            {
                if (Char.IsDigit(cur))
                {
                    postfix += cur;
                }
                if (IsOperator(cur))
                {
                    if (mstack.count == 0 || mstack.GetTop() == "(")
                    {
                        mstack.Push(Convert.ToString(cur));
                    }
                    else if (Priority(Char.Parse(mstack.GetTop())) < Priority(cur))
                    {
                        mstack.Push(Convert.ToString(cur));
                    }
                    else if (Priority(Char.Parse(mstack.GetTop())) >= Priority(cur))
                    {
                        while (mstack.count != 0 && mstack.GetTop() != "(" &&
                               !(Priority(Char.Parse(mstack.GetTop())) < Priority(cur)))
                        {
                            postfix += mstack.GetTop();
                            mstack.Pop();
                        }
                        mstack.Push(Convert.ToString(cur));
                    }
                }
                if (Convert.ToString(cur) == "(")
                {
                    mstack.Push(Convert.ToString(cur));
                }
                if (Convert.ToString(cur) == ")")
                {
                    while (mstack.count != 0 && mstack.GetTop() != "(")
                    {
                        postfix += mstack.GetTop();
                        mstack.Pop();
                    }
                    if (mstack.GetTop() == "(")
                    {
                        mstack.Pop();
                    }
                }
            }
            while (mstack.count != 0)
            {
                postfix += mstack.GetTop();
                mstack.Pop();
            }
            data = postfix;
            return(postfix);
        }
 public void Calc()
 {
     foreach (char x in data)
     {
         if (op.Contains(x))
         {
             if (stack.count < 2)
             {
                 Console.WriteLine("Ошибка");
                 f = 0;
                 break;
             }
             int op2 = Int32.Parse(stack.GetTop());
             stack.Pop();
             int op1 = Int32.Parse(stack.GetTop());
             stack.Pop();
             if (x == Char.Parse("+"))
             {
                 res = op1 + op2;
             }
             else if (x == Char.Parse("-"))
             {
                 res = op1 - op2;
             }
             else if (x == Char.Parse("*"))
             {
                 res = op1 * op2;
             }
             else
             {
                 res = op1 / op2;
             }
             stack.Push(Convert.ToString(res));
         }
         else
         {
             stack.Push(Convert.ToString(x));
         }
     }
     if (stack.count == 1)
     {
         Console.WriteLine("Ответ: " + stack.GetTop());
     }
     else if (f == 1)
     {
         Console.WriteLine("Ошибка");
     }
 }
示例#3
0
        static void Main(string[] args)
        {
            Console.WriteLine("Создание ограниченного стека в виде массива");
            ArrayStack arrayStack = new ArrayStack(5);

            arrayStack.Push(2);
            arrayStack.Push(5);
            arrayStack.GetTop();
            arrayStack.Pop();
            arrayStack.GetTop();
            arrayStack.DestroyStack();
            arrayStack.GetTop();
            Console.WriteLine("_____________________________________");

            Console.WriteLine("Создание стека в виде связанного списка");
            ConnectedListStack conStack = new ConnectedListStack();

            conStack.GetTop();
            conStack.Push("2");
            Console.WriteLine("Stack top = " + conStack.GetTop());
            conStack.Push("3");
            Console.WriteLine("Stack top = " + conStack.GetTop());
            conStack.Push("5");
            Console.WriteLine("Stack top = " + conStack.GetTop());
            conStack.Pop();
            Console.WriteLine("Stack top = " + conStack.GetTop());
            conStack.Pop();
            Console.WriteLine("Stack top = " + conStack.GetTop());
            Console.WriteLine("_____________________________________");

            Console.WriteLine("Создание ограниченной очереди");
            Queue queue = new Queue(5);

            queue.EnQueue(3);
            queue.EnQueue(2);
            queue.EnQueue(1);
            queue.GetFront();
            Console.WriteLine("Удаление первого элемента в очереди");
            queue.DeQueue();
            queue.GetFront();
            Console.WriteLine("_____________________________________");

            Console.WriteLine("Создание односвязного списка");
            LinkedList list = new LinkedList();

            list.Insert(0, 1);
            list.Insert(1, 2);
            list.Insert(2, 3);
            list.PrintList();
            Console.WriteLine("Удаление элемента под индексом 2");
            list.Remove(2);
            list.PrintList();
            Console.WriteLine("_____________________________________");

            Console.WriteLine("Создание двусвязного списка");
            Node             n1  = new Node(1);
            Node             n2  = new Node(2);
            Node             n3  = new Node(3);
            Node             n4  = new Node(4);
            DoubleLinkedList ddl = new DoubleLinkedList();

            ddl.InsertStart(n1);
            ddl.InsertEnd(n4);
            ddl.InsertAfter(n1, n2);
            ddl.InsertBefore(n4, n3);
            ddl.PrintDLL();
            ddl.Remove(n1);
            Console.WriteLine("Удаление элемента под индексом 0");
            ddl.PrintDLL();
            Console.WriteLine("_____________________________________");

            Console.WriteLine("Создание кольцевого односвязного списка");
            CycledLinkedList cll = new CycledLinkedList();

            cll.Insert(1);
            cll.Insert(2);
            cll.Insert(3);
            cll.PrintCLL(2);
            Console.WriteLine("_____________________________________");

            Console.WriteLine("Вычисление постфиксных выражений.");
            PostfixExpression exp = new PostfixExpression(" 2*(3+2)*((5*2-8)+(6-2*2))");

            Console.WriteLine("Инфиксное выражение: " + exp.GetStartExp());
            Console.WriteLine("Постиксное выражение: " + exp.ReversePostfix());
            exp.Calc();

            Console.ReadLine();
        }