<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[DSA tips and tricks]]></title><description><![CDATA[DSA tips and tricks]]></description><link>https://dsa-tips-tricks.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 17:11:52 GMT</lastBuildDate><atom:link href="https://dsa-tips-tricks.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Queue in Java — Easy Cheat Sheet for Interviews]]></title><description><![CDATA[1. Queue Using Array

Logic:  Fixed-size array with front and rear pointers.

Mini Code:


int arr[] = new int[size];
int front = 0, rear = 0;

void enqueue(int x) {
    arr[rear++] = x;
}

int dequeue() {
    return arr[front++];
}


Trick: Overflow...]]></description><link>https://dsa-tips-tricks.hashnode.dev/queue-in-java-easy-cheat-sheet-for-interviews</link><guid isPermaLink="true">https://dsa-tips-tricks.hashnode.dev/queue-in-java-easy-cheat-sheet-for-interviews</guid><category><![CDATA[queue]]></category><category><![CDATA[Java]]></category><category><![CDATA[DSA]]></category><category><![CDATA[#DSAinjava]]></category><dc:creator><![CDATA[paras jain]]></dc:creator><pubDate>Sat, 26 Apr 2025 16:52:07 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745686267622/04e75050-1441-4f78-ae66-25e90e233982.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-1-queue-using-array">1. Queue Using Array</h1>
<ul>
<li><p><strong>Logic</strong>:<br />  Fixed-size array with <code>front</code> and <code>rear</code> pointers.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java"><span class="hljs-keyword">int</span> arr[] = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[size];
<span class="hljs-keyword">int</span> front = <span class="hljs-number">0</span>, rear = <span class="hljs-number">0</span>;

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">enqueue</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{
    arr[rear++] = x;
}

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">dequeue</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> arr[front++];
}
</code></pre>
<blockquote>
<p><strong>Trick</strong>: Overflow if <code>rear == size</code>.</p>
</blockquote>
<hr />
<h1 id="heading-2-queue-using-linked-list">2. Queue Using Linked List</h1>
<ul>
<li><p><strong>Logic</strong>:<br />  Dynamic nodes with front and rear pointers.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Node</span> </span>{
    <span class="hljs-keyword">int</span> data;
    Node next;
}
Node front = <span class="hljs-keyword">null</span>, rear = <span class="hljs-keyword">null</span>;

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">enqueue</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{
    Node temp = <span class="hljs-keyword">new</span> Node();
    temp.data = x;
    <span class="hljs-keyword">if</span> (rear == <span class="hljs-keyword">null</span>) front = rear = temp;
    <span class="hljs-keyword">else</span> {
        rear.next = temp;
        rear = temp;
    }
}

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">dequeue</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">int</span> val = front.data;
    front = front.next;
    <span class="hljs-keyword">if</span> (front == <span class="hljs-keyword">null</span>) rear = <span class="hljs-keyword">null</span>;
    <span class="hljs-keyword">return</span> val;
}
</code></pre>
<blockquote>
<p><strong>Trick</strong>: No size limit, dynamic memory.</p>
</blockquote>
<hr />
<h1 id="heading-important-queue-problems-with-mini-code">🔥 Important Queue Problems (with mini code)</h1>
<hr />
<h3 id="heading-1-implement-queue-using-stacks">1️⃣ Implement Queue Using Stacks</h3>
<ul>
<li><p><strong>Logic</strong>: Use 2 stacks. Lazy transfer.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java">Stack&lt;Integer&gt; s1 = <span class="hljs-keyword">new</span> Stack&lt;&gt;();
Stack&lt;Integer&gt; s2 = <span class="hljs-keyword">new</span> Stack&lt;&gt;();

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">enqueue</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{
    s1.push(x);
}

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">dequeue</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">if</span> (s2.isEmpty()) 
        <span class="hljs-keyword">while</span> (!s1.isEmpty()) s2.push(s1.pop());
    <span class="hljs-keyword">return</span> s2.pop();
}
</code></pre>
<hr />
<h3 id="heading-2-implement-circular-queue">2️⃣ Implement Circular Queue</h3>
<ul>
<li><p><strong>Logic</strong>: <code>(index + 1) % size</code>.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java"><span class="hljs-keyword">int</span>[] arr = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[size];
<span class="hljs-keyword">int</span> front = -<span class="hljs-number">1</span>, rear = -<span class="hljs-number">1</span>;

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">enqueue</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{
    <span class="hljs-keyword">if</span> ((rear + <span class="hljs-number">1</span>) % size == front) <span class="hljs-comment">// full</span>
    rear = (rear + <span class="hljs-number">1</span>) % size;
    arr[rear] = x;
    <span class="hljs-keyword">if</span> (front == -<span class="hljs-number">1</span>) front = <span class="hljs-number">0</span>;
}

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">dequeue</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">int</span> val = arr[front];
    <span class="hljs-keyword">if</span> (front == rear) front = rear = -<span class="hljs-number">1</span>; <span class="hljs-comment">// empty</span>
    <span class="hljs-keyword">else</span> front = (front + <span class="hljs-number">1</span>) % size;
    <span class="hljs-keyword">return</span> val;
}
</code></pre>
<hr />
<h3 id="heading-3-level-order-traversal-binary-tree">3️⃣ Level Order Traversal (Binary Tree)</h3>
<ul>
<li><p><strong>Logic</strong>: BFS</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java">Queue&lt;TreeNode&gt; q = <span class="hljs-keyword">new</span> LinkedList&lt;&gt;();
q.add(root);

<span class="hljs-keyword">while</span> (!q.isEmpty()) {
    TreeNode node = q.poll();
    <span class="hljs-keyword">if</span> (node.left != <span class="hljs-keyword">null</span>) q.add(node.left);
    <span class="hljs-keyword">if</span> (node.right != <span class="hljs-keyword">null</span>) q.add(node.right);
}
</code></pre>
<hr />
<h3 id="heading-4-first-non-repeating-character-stream">4️⃣ First Non-Repeating Character (Stream)</h3>
<ul>
<li><p><strong>Logic</strong>: Queue + Freq count.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java">Queue&lt;Character&gt; q = <span class="hljs-keyword">new</span> LinkedList&lt;&gt;();
<span class="hljs-keyword">int</span>[] freq = <span class="hljs-keyword">new</span> <span class="hljs-keyword">int</span>[<span class="hljs-number">26</span>];

<span class="hljs-keyword">for</span> (<span class="hljs-keyword">char</span> ch : stream) {
    freq[ch - <span class="hljs-string">'a'</span>]++;
    q.add(ch);
    <span class="hljs-keyword">while</span> (!q.isEmpty() &amp;&amp; freq[q.peek() - <span class="hljs-string">'a'</span>] &gt; <span class="hljs-number">1</span>) q.poll();
}
</code></pre>
<hr />
<h3 id="heading-5-sliding-window-maximum">5️⃣ Sliding Window Maximum</h3>
<ul>
<li><p><strong>Logic</strong>: Deque for indices.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java">Deque&lt;Integer&gt; dq = <span class="hljs-keyword">new</span> LinkedList&lt;&gt;();

<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; n; i++) {
    <span class="hljs-keyword">if</span> (!dq.isEmpty() &amp;&amp; dq.peek() == i - k) dq.poll();
    <span class="hljs-keyword">while</span> (!dq.isEmpty() &amp;&amp; nums[dq.peekLast()] &lt; nums[i]) dq.pollLast();
    dq.offer(i);
    <span class="hljs-keyword">if</span> (i &gt;= k - <span class="hljs-number">1</span>) ans.add(nums[dq.peek()]);
}
</code></pre>
<hr />
<h3 id="heading-6-rotten-oranges">6️⃣ Rotten Oranges</h3>
<ul>
<li><p><strong>Logic</strong>: Multi-source BFS.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java">Queue&lt;<span class="hljs-keyword">int</span>[]&gt; q = <span class="hljs-keyword">new</span> LinkedList&lt;&gt;();

<span class="hljs-keyword">for</span> (all rotten oranges) q.add({i, j, <span class="hljs-number">0</span>});

<span class="hljs-keyword">while</span> (!q.isEmpty()) {
    <span class="hljs-keyword">int</span>[] cell = q.poll();
    <span class="hljs-keyword">for</span> (<span class="hljs-number">4</span> directions) {
        <span class="hljs-keyword">if</span> (fresh orange) {
            grid[x][y] = <span class="hljs-number">2</span>;
            q.add({x, y, time+<span class="hljs-number">1</span>});
        }
    }
}
</code></pre>
<hr />
<h3 id="heading-7-number-of-islands">7️⃣ Number of Islands</h3>
<ul>
<li><p><strong>Logic</strong>: BFS for every unvisited land.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java"><span class="hljs-keyword">for</span> (i,j) {
    <span class="hljs-keyword">if</span> (grid[i][j] == <span class="hljs-string">'1'</span>) {
        bfs(i, j);
        count++;
    }
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">bfs</span><span class="hljs-params">(<span class="hljs-keyword">int</span> i, <span class="hljs-keyword">int</span> j)</span> </span>{
    Queue&lt;<span class="hljs-keyword">int</span>[]&gt; q = <span class="hljs-keyword">new</span> LinkedList&lt;&gt;();
    q.add({i,j});
    <span class="hljs-keyword">while</span> (!q.isEmpty()) {
        <span class="hljs-keyword">int</span>[] cell = q.poll();
        mark visited;
        add all <span class="hljs-number">4</span> neighbors <span class="hljs-keyword">if</span> <span class="hljs-string">'1'</span>
    }
}
</code></pre>
<hr />
<h3 id="heading-8-reverse-a-queue">8️⃣ Reverse a Queue</h3>
<ul>
<li><p><strong>Logic</strong>: Recursion or Stack.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">reverse</span><span class="hljs-params">(Queue&lt;Integer&gt; q)</span> </span>{
    <span class="hljs-keyword">if</span> (q.isEmpty()) <span class="hljs-keyword">return</span>;
    <span class="hljs-keyword">int</span> x = q.poll();
    reverse(q);
    q.add(x);
}
</code></pre>
<hr />
<h3 id="heading-9-generate-binary-numbers-from-1-to-n">9️⃣ Generate Binary Numbers from 1 to N</h3>
<ul>
<li><p><strong>Logic</strong>: BFS of strings.</p>
</li>
<li><p><strong>Mini Code</strong>:</p>
</li>
</ul>
<pre><code class="lang-java">Queue&lt;String&gt; q = <span class="hljs-keyword">new</span> LinkedList&lt;&gt;();
q.add(<span class="hljs-string">"1"</span>);

<span class="hljs-keyword">while</span> (n-- &gt; <span class="hljs-number">0</span>) {
    String s1 = q.poll();
    System.out.println(s1);
    q.add(s1 + <span class="hljs-string">"0"</span>);
    q.add(s1 + <span class="hljs-string">"1"</span>);
}
</code></pre>
<hr />
<h1 id="heading-full-summary-table">🧠 Full Summary Table</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Problem</td><td>Logic</td></tr>
</thead>
<tbody>
<tr>
<td>Queue with Array</td><td>Front, Rear pointers</td></tr>
<tr>
<td>Queue with Linked List</td><td>Dynamic Nodes</td></tr>
<tr>
<td>Queue using Stacks</td><td>2 Stacks + Lazy Transfer</td></tr>
<tr>
<td>Circular Queue</td><td>Modulo operation</td></tr>
<tr>
<td>Level Order Traversal</td><td>BFS Queue</td></tr>
<tr>
<td>First Non-Repeating Character</td><td>Queue + Freq</td></tr>
<tr>
<td>Sliding Window Maximum</td><td>Deque</td></tr>
<tr>
<td>Rotten Oranges</td><td>BFS Multi-Source</td></tr>
<tr>
<td>Number of Islands</td><td>BFS per land</td></tr>
<tr>
<td>Reverse Queue</td><td>Recursion</td></tr>
<tr>
<td>Generate Binary Numbers</td><td>BFS on strings</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-final-tip">Final Tip</h1>
<blockquote>
<p>Jaise hi "Level Order", "Stream", "Window", "Propagation", "Islands" suno —<br /><strong>Queue / Deque / BFS ka flash hona chahiye!</strong> 🚀</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Stack-Based String Problems – Intuition Cheat Sheet]]></title><description><![CDATA[When you're faced with tricky string problems that involve brackets, nested patterns, or context switching, there's a high chance a stack is your best friend. In this article, we break down the intuition behind stack-based string problems and give yo...]]></description><link>https://dsa-tips-tricks.hashnode.dev/stack-intuition-cheat-sheet</link><guid isPermaLink="true">https://dsa-tips-tricks.hashnode.dev/stack-intuition-cheat-sheet</guid><category><![CDATA[stack]]></category><category><![CDATA[cheatsheet]]></category><category><![CDATA[string]]></category><category><![CDATA[DSA]]></category><category><![CDATA[#DSAinjava]]></category><dc:creator><![CDATA[paras jain]]></dc:creator><pubDate>Fri, 25 Apr 2025 06:05:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745686451812/c6921081-990c-4e67-8929-b0d73c07e5f9.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When you're faced with tricky string problems that involve brackets, nested patterns, or context switching, there's a high chance a <strong>stack</strong> is your best friend. In this article, we break down the intuition behind stack-based string problems and give you a cheat sheet you can always come back to.</p>
<hr />
<h2 id="heading-why-stack">🧠 Why Stack?</h2>
<p>Stacks are perfect when you need a <strong>Last-In-First-Out (LIFO)</strong> structure. That means when you go into a nested structure or a new "context," you can push it onto the stack, and when you're done, pop it back out in the correct order.</p>
<hr />
<h2 id="heading-1-decode-string">🔄 1. Decode String</h2>
<p><strong>Example:</strong> <code>"3[a2[c]]"</code> → <code>"accaccacc"</code></p>
<h3 id="heading-problem">🤔 Problem:</h3>
<p>You're given a string with numbers and brackets. The goal is to decode it.</p>
<h3 id="heading-solution-intuition">🕵️‍ Solution Intuition:</h3>
<ul>
<li><p>Use a <strong>count stack</strong> to store repeat numbers.</p>
</li>
<li><p>Use a <strong>string stack</strong> to store the previous string context.</p>
</li>
<li><p>When you hit ']', you pop the top count and string, repeat the current segment, and combine.</p>
</li>
</ul>
<hr />
<h2 id="heading-2-valid-parentheses">🔍 2. Valid Parentheses</h2>
<p><strong>Example:</strong> <code>"({[]})"</code> → Valid</p>
<h3 id="heading-problem-1">📄 Problem:</h3>
<p>Check if every opening bracket has a matching closing bracket.</p>
<h3 id="heading-solution-intuition-1">🏛️ Solution Intuition:</h3>
<ul>
<li><p>Push opening brackets to the stack.</p>
</li>
<li><p>On closing bracket, check if it matches the top of the stack.</p>
</li>
<li><p>If mismatched or stack is not empty at end, it's invalid.</p>
</li>
</ul>
<hr />
<h2 id="heading-3-evaluate-reverse-polish-notation">📊 3. Evaluate Reverse Polish Notation</h2>
<p><strong>Example:</strong> <code>["2", "1", "+", "3", "*"]</code> → <code>(2 + 1) * 3 = 9</code></p>
<h3 id="heading-problem-2">🔎 Problem:</h3>
<p>Evaluate a postfix expression.</p>
<h3 id="heading-solution-intuition-2">⚖️ Solution Intuition:</h3>
<ul>
<li><p>Push numbers to the stack.</p>
</li>
<li><p>When an operator appears, pop the top two numbers, apply the operation, and push the result.</p>
</li>
</ul>
<hr />
<h2 id="heading-4-simplify-unix-style-path">🔠 4. Simplify Unix-Style Path</h2>
<p><strong>Example:</strong> <code>"/a/./b/../../c/"</code> → <code>"/c"</code></p>
<h3 id="heading-problem-3">🤝 Problem:</h3>
<p>Simplify a string representing a Unix-style path.</p>
<h3 id="heading-solution-intuition-3">🔧 Solution Intuition:</h3>
<ul>
<li><p>Split the path by '/' and use a stack.</p>
</li>
<li><p>If you see "..", pop from the stack.</p>
</li>
<li><p>If you see a valid folder, push it.</p>
</li>
<li><p>Join the stack with '/' at the end.</p>
</li>
</ul>
<hr />
<h2 id="heading-5-remove-all-adjacent-duplicates">🌟 5. Remove All Adjacent Duplicates</h2>
<p><strong>Example:</strong> <code>"abbaca"</code> → <code>"ca"</code></p>
<h3 id="heading-problem-4">❌ Problem:</h3>
<p>Remove characters that appear consecutively.</p>
<h3 id="heading-solution-intuition-4">🏠 Solution Intuition:</h3>
<ul>
<li><p>Use a stack.</p>
</li>
<li><p>If the current character matches the top, pop it.</p>
</li>
<li><p>Else, push it.</p>
</li>
</ul>
<hr />
<h2 id="heading-bonus-quick-self-checklist-before-choosing-stack">📌 Bonus: Quick Self-Checklist Before Choosing Stack</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Ask Yourself</td><td>If Yes, Use Stack?</td></tr>
</thead>
<tbody>
<tr>
<td>Is there nesting or reversal involved?</td><td>✅ Yes</td></tr>
<tr>
<td>Do I need to backtrack or undo something?</td><td>✅ Yes</td></tr>
<tr>
<td>Are characters being grouped contextually?</td><td>✅ Yes</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-common-patterns-to-memorize">🔹 Common Patterns To Memorize</h2>
<pre><code class="lang-java"><span class="hljs-comment">// Decode String</span>
<span class="hljs-keyword">char</span> = digit → store k
<span class="hljs-keyword">char</span> = <span class="hljs-string">'['</span>   → push k &amp; current, reset current
<span class="hljs-keyword">char</span> = letter → append to current
<span class="hljs-keyword">char</span> = <span class="hljs-string">']'</span>   → pop k &amp; prev, repeat current and append

<span class="hljs-comment">// Valid Parentheses</span>
<span class="hljs-keyword">if</span> opening bracket → push
<span class="hljs-keyword">if</span> closing → match with top

<span class="hljs-comment">// Postfix Eval</span>
<span class="hljs-keyword">if</span> number → push
<span class="hljs-keyword">if</span> operator → pop <span class="hljs-number">2</span>, apply, push result

<span class="hljs-comment">// Simplify Path</span>
split by <span class="hljs-string">'/'</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">".."</span> → pop
<span class="hljs-keyword">if</span> valid folder → push
</code></pre>
<hr />
<h2 id="heading-final-tip">📚 Final Tip:</h2>
<p>Practicing stack problems improves pattern recognition over time. Once you see brackets or nested structure, your brain will automatically say: <strong>"Stack time!"</strong></p>
<p>Want to take it further? Try LeetCode problems like:</p>
<ul>
<li><p>Decode String</p>
</li>
<li><p>Simplify Path</p>
</li>
<li><p>Valid Parentheses</p>
</li>
<li><p>Basic Calculator II</p>
</li>
<li><p>Remove All Adjacent Duplicates</p>
</li>
</ul>
<p>Save this cheat sheet. It’s your Stack Survival Kit ⛏️ for string-based problems!</p>
]]></content:encoded></item></channel></rss>