Skip to content

Instantly share code, notes, and snippets.

@binaryPUNCH
Last active November 7, 2015 18:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save binaryPUNCH/22aaa3209f8554d797d8 to your computer and use it in GitHub Desktop.
Save binaryPUNCH/22aaa3209f8554d797d8 to your computer and use it in GitHub Desktop.
// nu med c# stack
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Reverse_Polish_Notation
{
internal class Program
{
// Alt er meget nemmere at visualiserer hvis du samtidigt kigger på opgavens billede
private static void Main(string[] args)
{
string newYork = "(A+B)/(C-D)";
string california = "";
Stack texasStack = new Stack();
texasStack.Push("@");
for (int i = 0; i < newYork.Length; i++) //hovedløkken der gentager sig for hvert char i newYork
{
char newYorkTemp = newYork[i]; //det char der kommer til switch
if (char.IsLetterOrDigit(newYorkTemp)) //tjek om switch char er et bogstav/tal eller ej
{
california += newYork[i]; //alle bogstaver/tal er nemme - de skal bare direkte til californien, ellers skal CheckOperator bruges til at finde de 5 forskellige muligheder der er.
}
else // Her er de 5 muligheder:
{
if (CheckOperator(newYorkTemp, Convert.ToChar(texasStack.Peek())) == 1) // 1: Nemt, din char skal bare lægges til texas
{
texasStack.Push(newYorkTemp);
}
else if (CheckOperator(newYorkTemp, Convert.ToChar(texasStack.Peek())) == 2) // 2: Lidt tricky, din seneste char i Texas skal fjernes fra texas og lægges til californien
{
california += Convert.ToString(texasStack.Pop());
i--;
}
else if (CheckOperator(newYorkTemp, Convert.ToChar(texasStack.Peek())) == 3) // 3: Både newYorkTemp (altså den char i switchen), og det seneste Texas char skal forsvinde
{
texasStack.Pop();
// man behøver ikke "fjerne" newYorkTemp da den alligevel forsvinder næste gang vores hovedløkke køre
}
else if (CheckOperator(newYorkTemp, Convert.ToChar(texasStack.Peek())) == 4) // 4: Færdigt!
{
Console.WriteLine("The Reverse Polish Notation of your input is: {0}", california);
}
else if (CheckOperator(newYorkTemp, Convert.ToChar(texasStack.Peek())) == 5) // 5: Selvsigende at noget gik galt.
{
Console.WriteLine("An error has occurred. The original formula was not correctly balanced.");
}
}
}
//spejlvende det færdige stack/texas og lægge det til den nu færdige sætning(california)
for (int i = texasStack.Count; i > 1; i--)
{
california += texasStack.Pop().ToString();
}
Console.WriteLine("The Reverse Polish Notation of your input is: {0}", california);
Console.ReadLine();
}
// Her er CheckOperator metoden, der ved hjælp af texasTemp og newYorkTemp, kan afgøre hvad der skal ske i switchen.
// Den returnere enten 1,2,3,4 eller 5
public static int CheckOperator(char texasTemp, char newYorkTemp)
{
int[,] instruction =
{
{4,1,1,1,1,1,5},
{2,2,2,1,1,1,2},
{2,2,2,1,1,1,2},
{2,2,2,2,2,1,2},
{2,2,2,2,2,1,2},
{5,1,1,1,1,1,3},
};
int x = 0; // 7 hen, new york
int y = 0; // 6 ned, texas
//new york char
if (texasTemp == '@')
{ x = 0; }
else if (texasTemp == '+')
{ x = 1; }
else if (texasTemp == '-')
{ x = 2; }
else if (texasTemp == '*')
{ x = 3; }
else if (texasTemp == '/')
{ x = 4; }
else if (texasTemp == '(')
{ x = 5; }
else if (texasTemp == ')')
{ x = 6; }
// texas char
if (newYorkTemp == '@')
{ y = 0; }
else if (newYorkTemp == '+')
{ y = 1; }
else if (newYorkTemp == '-')
{ y = 2; }
else if (newYorkTemp == '*')
{ y = 3; }
else if (newYorkTemp == '/')
{ y = 4; }
else if (newYorkTemp == '(')
{ y = 5; }
int checkOperatorReturn = instruction[y, x];
return checkOperatorReturn;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment