Exercise
Queue Stack Reverse Polish Notation
Objective
Create a program that reads a Reverse Polish Notation expression from a text file, for example:
3 4 6 5 - + * 6 +
(Result 21)
Each item will be stored in a queue. Once the queue has all the items stored, you will need to transfer them from the queue to a stack using the Queue and Stack classes provided in C#.
Finally, you will operate with the stack to get the correct result of the RPN expression and show it on the console.
Write Your C# Exercise
C# Exercise Example
// Importing the necessary namespaces for basic functionalities and collections
using System; // For basic functionalities like Console
using System.Collections.Generic; // For using the Queue and Stack classes
using System.IO; // For reading from a file
class Program
{
static void Main(string[] args)
{
// Reading the Reverse Polish Notation (RPN) expression from a file
string filePath = "rpn_expression.txt"; // File where the RPN expression is stored
if (!File.Exists(filePath))
{
Console.WriteLine("The file does not exist.");
return;
}
// Read the contents of the file (RPN expression)
string[] rpnExpression = File.ReadAllText(filePath).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
// Create a Queue to store the elements from the RPN expression
Queue queue = new Queue();
// Enqueue the elements of the RPN expression into the queue
foreach (var item in rpnExpression)
{
queue.Enqueue(item);
}
// Create a Stack to evaluate the RPN expression
Stack stack = new Stack();
// Process each element in the queue, transferring to the stack and calculating the result
while (queue.Count > 0)
{
string current = queue.Dequeue(); // Dequeue the next element from the queue
if (IsOperator(current))
{
// If it's an operator, pop two values from the stack, perform the operation and push the result
int operand2 = stack.Pop();
int operand1 = stack.Pop();
int result = PerformOperation(operand1, operand2, current);
stack.Push(result);
}
else
{
// If it's a number, push it onto the stack
stack.Push(int.Parse(current));
}
}
// The result of the RPN expression will be the last item in the stack
if (stack.Count == 1)
{
Console.WriteLine($"Result: {stack.Pop()}");
}
else
{
Console.WriteLine("Invalid RPN expression.");
}
}
// Helper method to check if a string is an operator
static bool IsOperator(string str)
{
return str == "+" || str == "-" || str == "*" || str == "/";
}
// Helper method to perform the operation based on the operator
static int PerformOperation(int operand1, int operand2, string operatorSymbol)
{
switch (operatorSymbol)
{
case "+":
return operand1 + operand2;
case "-":
return operand1 - operand2;
case "*":
return operand1 * operand2;
case "/":
return operand1 / operand2;
default:
throw new InvalidOperationException("Invalid operator.");
}
}
}