Welcome back! As we dive further into stack operations in PHP, consider how these data structures can simplify tasks, both in programming and everyday scenarios. Stacks operate much like stacking plates: the last plate you put on top is the first one you'll take off. In computing, stacks allow us to temporarily store data elements, managing them in a Last-In, First-Out (LIFO) manner. Today, we'll apply this principle using PHP to solve two specific problems, strengthening our understanding of stack operations.
Validating nested structures, such as parentheses, is crucial in programming, similar to ensuring all opened boxes are correctly closed. Here, we'll create a PHP function to verify that a string of parentheses is properly nested and closed — effectively checking for balance.
A basic approach might involve counting each type of bracket (parentheses, braces, and square brackets), incrementing counts for opening brackets, and decrementing for closing ones. This method confirms every opening bracket finds a closure but doesn't consider their order. For balanced brackets, each closing bracket must correspond to the most recently opened bracket of its type.
Utilizing a stack is an efficient way to solve this problem. Stacks follow the LIFO principle, making them ideal for tracking the order of opening and closing brackets — the most recent opening bracket needs completion before others.
We create an associative array that maps each opening bracket to its closing partner and use an empty stack. By iterating through each character of the string:
- If it's an opening bracket, add it to the stack.
- If it's a closing bracket and matches the stack's top element, remove that element from the stack.
If at any time a closing bracket doesn't match the top of the stack, or the stack is empty when it shouldn't be, the string is unbalanced.
Let's introduce the bracket mapping and implementation loop in PHP:
php1<?php 2 3function areBracketsBalanced($inputStr) { 4 $bracketMap = ['(' => ')', '[' => ']', '{' => '}']; 5 $openPar = array_keys($bracketMap); 6 $stack = []; 7 8 for ($i = 0; $i < strlen($inputStr); $i++) { 9 $character = $inputStr[$i]; 10 if (in_array($character, $openPar)) { 11 array_push($stack, $character); 12 } else if (!empty($stack) && $character === $bracketMap[end($stack)]) { 13 array_pop($stack); 14 } else { 15 return false; 16 } 17 } 18 19 return empty($stack); 20} 21 22// Test 23echo areBracketsBalanced("(){}[]") ? 'true' . PHP_EOL : 'false' . PHP_EOL; // prints: true 24echo areBracketsBalanced("([)]") ? 'true' . PHP_EOL : 'false' . PHP_EOL; // prints: false 25?>
The function areBracketsBalanced
evaluates false
in these cases:
- A closing bracket appears with an empty stack.
- A closing bracket mismatches the latest opening bracket.
- Opening brackets remain in the stack after processing.
Now let's flip the script — literally. We'll reverse strings to demonstrate efficient data structure utilization in practical scenarios.
Consider a function that accepts a string and outputs its reverse, a basic feature with vast applications. For instance, stack buffers can reorder data packets. Reversing elements with a stack is a crucial skill.
PHP's array, acting as a stack with LIFO capability, can reverse elements. Push characters to the stack; then pop them out to reverse the string order, akin to unwinding a reel backward.
Here's the PHP solution using an array to simulate a stack:
php1<?php 2 3function reverseStringUsingStack($str) { 4 $stack = []; 5 for ($i = 0; $i < strlen($str); $i++) { 6 array_push($stack, $str[$i]); 7 } 8 $reversed = ''; 9 while (!empty($stack)) { 10 $reversed .= array_pop($stack); 11 } 12 return $reversed; 13} 14 15// Test 16echo reverseStringUsingStack("hello"); // prints: olleh 17?>
This solution effectively mirrors original sequences, providing a simple yet powerful demonstration of stack operations.
Today, we tackled two classic problems using stacks. Their LIFO nature allowed us to verify the correctness of nested structures and reverse sequences efficiently with PHP. Through these exercises, you've gained valuable insights into solving order-sensitive problems using data structures, preparing you to handle complex, real-world programming tasks. Keep practicing, and happy coding!