Yığın yapısı kullanarak Infix’ten Postfix’e dönüşüm işlemlerini şu şekillerle daha iyi anlayabiliriz.

Örnek

using System;

namespace postfix
{
    class Program
    {
        static char[] stack = new char[100];
        static int sp = -1;
        static void push(char data)
        {
            sp++;
            stack[sp] = data;
        }
        static char pop()
        {
            char data = stack[sp];
            sp--;
            return data;
        }
        static char peek()
        {
            return stack[sp];
        }
        static void Main(string[] args)
        {
            string infix = "a+b-c+d*e*f/g-h";
            push('$');
            string vars = "abcdefgh";
            string ops = "$+-*/";
            int[] onc = new int[5];
            onc[0] = 0; // $
            onc[1] = 1; // +
            onc[2] = 1; // -
            onc[3] = 2; // *
            onc[4] = 2; // /
            string postfix = "";
            for (int i = 0; i < infix.Length; i++)
            {
                if(vars.IndexOf(infix[i]) >= 0)
                    postfix += infix[i];
                else
                {
                    if(onc[ops.IndexOf(infix[i])] > onc[ops.IndexOf(peek())])
                        push(infix[i]);
                    else
                    {
                        postfix += pop();
                        push(infix[i]);
                    }
                }
            }
            while(peek() != '$') postfix += pop();
            Console.WriteLine(postfix);
        }
    }
}

Eğer parantez içeren bir infix işlemini postfix işlemine dönüştürme isteseydik kod aşağıdaki hali alacaktı.

using System;

namespace postfix_parantezli
{
    class Program
    {
        static char[] stack = new char[100];
        static int sp = -1;
        static void push(char data)
        {
            sp++;
            stack[sp] = data;
        }
        static char pop()
        {
            char data = stack[sp];
            sp--;
            return data;
        }
        static char peek()
        {
            return stack[sp];
        }
        static void Main(string[] args)
        {
            string infix = "a+b+c/d*(a-b-c*d)";
            push('$');
            string vars = "abcd";
            string ops = "$(+-*/";
            int[] onc = new int[6];
            onc[0] = 0; // $
            onc[1] = 0; // (
            onc[2] = 1; // +
            onc[3] = 1; // -
            onc[4] = 2; // *
            onc[5] = 2; // /
            string postfix = "";
            for (int i = 0; i < infix.Length; i++)
            {
                if(infix[i] == '(')
                {
                    push(infix[i]);
                    continue;
                }
                if(infix[i] == ')')
                {
                    while(peek() != '(') postfix += pop();
                    pop();
                    continue;
                }
                if(vars.IndexOf(infix[i]) >= 0)
                    postfix += infix[i];
                else
                {
                    if(onc[ops.IndexOf(infix[i])] > onc[ops.IndexOf(peek())])
                        push(infix[i]);
                    else
                    {
                        postfix += pop();
                        push(infix[i]);
                    }
                }
            }
            while (peek() != '$') postfix += pop();
            Console.WriteLine(postfix);
        }
    }
}

Şimdi herhangi bir üslü sayı içerecek olan infix ifadenin postfix ifadeye nasıl dönüştürüleceğini ele alalım.

using System;

namespace postfix_uslu
{
    class Program
    {
        static char[] stack = new char[100];
        static int sp = -1;
        static void push(char data)
        {
            sp++;
            stack[sp] = data;
        }
        static char pop()
        {
            char data = stack[sp];
            sp--;
            return data;
        }
        static char peek()
        {
            return stack[sp];
        }
        static void Main(string[] args)
        {
            string infix = "a*b^c-d";
            push('$');
            string vars = "abcd";
            string ops = "$(+-*/^";
            int[] onc = new int[7];
            onc[0] = 0; // $
            onc[1] = 0; // (
            onc[2] = 1; // +
            onc[3] = 1; // -
            onc[4] = 2; // *
            onc[5] = 2; // /
            onc[6] = 3; // ^
            string postfix = "";
            for (int i = 0; i < infix.Length; i++)
            {
                if (infix[i] == '(')
                {
                    push(infix[i]);
                    continue;
                }
                if (infix[i] == ')')
                {
                    while (peek() != '(') postfix += pop();
                    pop();
                    continue;
                }
                if (vars.IndexOf(infix[i]) >= 0)
                {
                    postfix += infix[i];
                }
                else
                {
                    if (onc[ops.IndexOf(peek())] < onc[ops.IndexOf(infix[i])])
                    {
                        push(infix[i]);
                    }
                    else
                    {
                        postfix += pop();
                        push(infix[i]);
                    }
                }
            }
            while (peek() != '$') postfix += pop();
            Console.WriteLine(postfix);
        }
    }
}

Şimdi postfix bir ifadeyi yığın yapısı kullanarak sayısal karşılığını bulalım.

using System;

namespace postfix_sayisal_karsilik
{
    class Program
    {
        static int[] stack = new int[100];
        static int sp = -1;
        static void push (int data)
        {
            sp++;
            stack[sp] = data;
        }
        static int pop()
        {
            int data = stack[sp];
            sp--;
            return data;
        }
        static int peek()
        {
            return stack[sp];
        }
        static int sum(int p1, int p2)
        {
            return p1 + p2;
        }
        static int subtract(int p1, int p2)
        {
            return p1 - p2;
        }
        static int multiply(int p1, int p2)
        {
            return p1 * p2;
        }
        static int divide(int p1, int p2)
        {
            return p1 / p2;
        }
        static void Main(string[] args)
        {
            string postfix = "abc*+";
            string ops = "+-*/";
            string vars = "abc";
            int[] vals = new int[3];
            vals[0] = 1;
            vals[1] = 2;
            vals[2] = 3;
            for (int i = 0; i < postfix.Length; i++)
            {
                if (ops.IndexOf(postfix[i]) == -1)
                    push(vals[vars.IndexOf(postfix[i])]);
                else
                {
                    int p1 = pop();
                    int p2 = pop();
                    if (postfix[i] == '+') push(sum(p1, p2));
                    if (postfix[i] == '-') push(subtract(p1, p2));
                    if (postfix[i] == '*') push(multiply(p1, p2));
                    if (postfix[i] == '/') push(divide(p1, p2));
                }
            }
            Console.WriteLine(pop());
        }
    }
}